1 Introduction

Bees are essential for maintaining ecosystems and supporting the health of the biosphere through their role in pollination. Bees are key pollinators for many fruits, vegetables, nuts, and seeds. Approximately one-third of the human food supply depends on insect pollination, predominantly by bees (Syngenta 2021). This underscores why the European honey bee is considered the most economically important pollinator for agricultural crops worldwide (Conte and Navajas 2008).

In recent years, however, bee mortality and the decline of bee colonies have raised serious concerns. This alarming trend is driven by a variety of factors, with climate change emerging as a significant threat. Climate change introduces multiple stressors, including rising temperatures and an increasing frequency of droughts (Rankin, Barney, and Lozano 2020).

To better understand the impact of climate change on bee populations, it is crucial to examine the relationship between environmental stressors and bee mortality rates. Among these stressors, droughts may play a significant role due to their potential direct and indirect impacts on floral resources and habitat availability. In the following sections, the data is presented and analyzed to explore the connection between droughts and bee mortality.

2 Data Overview

2.1 Understanding the Drought Dataset

This section delves into the characteristics of the drought data, including its sources, key variables, and temporal coverage.

The dataset is sourced from the TidyTuesday repository and was originally compiled by the National Integrated Drought Information System (NIDIS).

2.1.1 Dataset Structure

The drought data consists of two related datasets:
1. drought.csv: State-level data on drought and wetness conditions over time.
2. drought_fips.csv: County-level data on drought conditions using FIPS codes for localized analysis.

These datasets provide detailed information on drought frequency and intensity across different regions and time periods within the United States. The data points are taken daily over a span from the year 1895 to the present.

2.1.2 Insights in the drought.csv dataset:

Key variables include DATE, which records the date of observation, and severity levels such as D0 (abnormally dry), D1 (moderate drought), D2 (severe drought), D3 (extreme drought), and D4 (exceptional drought). Similarly, W0 to W4 track wetness levels. with W0 representing the least wet conditions and W4 indicating the wettest conditions. The state variable indicates the location.

To provide a closer look, the following table shows a preview of the data:
Preview of the drought dataset (drought.csv)
0 DATE D0 D1 D2 D3 D4 -9 W0 W1 W2 W3 W4 state
59.4 d_19780401 14.6 3.5 0.1 0.0 0.0 0 26.0 20.7 8.3 0.1 0.0 alabama
38.9 d_19780501 0.2 0.0 0.0 0.0 0.0 0 60.9 29.9 12.3 4.3 0.0 alabama
70.0 d_19780601 0.9 0.0 0.0 0.0 0.0 0 29.0 22.5 10.2 3.9 0.5 alabama
41.0 d_19780701 34.1 18.9 2.5 0.0 0.0 0 25.0 21.0 9.5 3.6 1.5 alabama
18.3 d_19780801 57.4 48.0 24.0 10.2 1.4 0 24.3 17.2 4.5 2.3 1.1 alabama
26.3 d_19780901 54.1 40.5 15.3 5.0 0.0 0 19.6 12.6 2.4 1.3 0.0 alabama
23.2 d_19781001 75.1 64.7 36.9 18.9 5.2 0 1.6 0.2 0.0 0.0 0.0 alabama
36.4 d_19781101 59.0 42.7 13.9 3.4 0.0 0 4.7 0.9 0.0 0.0 0.0 alabama
58.6 d_19781201 34.4 13.6 0.5 0.0 0.0 0 7.0 1.6 0.0 0.0 0.0 alabama
69.4 d_19790101 5.1 0.7 0.0 0.0 0.0 0 25.5 8.7 0.5 0.0 0.0 alabama
62.4 d_19790201 25.0 7.0 0.1 0.0 0.0 0 12.5 4.0 0.1 0.0 0.0 alabama

We can see that, for example, in the fourth row of the table, Alabama experienced significant drought conditions on July 1, 1978. On this date, 34.1% of the state was categorized as abnormally dry (D0), 18.9% as moderate drought (D1), and 2.5% as severe drought (D2). No areas were recorded under extreme drought (D3) or exceptional drought (D4).

On the wetness side, 25.0% of the state was under least wet conditions (W0), 21.0% under moderately wet conditions (W1), 9.5% under very wet conditions (W2), and 3.6% under extremely wet conditions (W3). A small portion (1.5%) of the state fell into the wettest conditions (W4) category, indicating the highest levels of wetness during this time.

The attentive reader may have noticed the inclusion of the 0 and -9 columns in the dataset. These columns serve an important purpose in interpreting the data. The 0 column indicates the total percentage of the state experiencing any form of drought conditions. For example, in this case, it shows 41.0% for Alabama on July 1, 1978, representing the combined percentage of the state categorized under D0 through D4.

On the other hand, the -9 column captures the percentage of the state for which no data was available. This could include regions not monitored or excluded from the analysis. For this particular date and location, the -9 value is 0%, meaning that complete data was recorded for Alabama.

2.1.3 Insights in the drought_fips.csv dataset:

In addition to the main drought dataset, drought.csv, the drought_fips.csv dataset provides detailed information on drought conditions categorized by the Federal Information Processing Standards (FIPS) code, a unique identifier for geographical regions within the United States. This additional data allows for a more granular analysis of drought conditions at the county or region level, helping to track localized drought trends over time.

To illustrate this further, the following table shows a preview of the drought_fips.csv dataset:
Preview of the drought-fips dataset (drought_fips.csv)
State FIPS DSCI date
AL 01003 100 2006-11-14
AL 01003 87 2006-11-21
AL 01003 80 2006-11-28
AL 01003 100 2006-12-05
AL 01003 98 2006-12-12
AL 01003 99 2006-12-19

For instance, looking at the second row of the table, the FIPS code 01003 corresponds to Baldwin County in Alabama, as confirmed by the state column showing AL. The DSCI (Drought Severity and Coverage Index) is a measure used to assess the severity and extent of drought conditions, with values ranging from 0 (no drought) to 500 (extreme drought). On November 21, 2006, the DSCI value for Baldwin County is recorded as 87, indicating a moderately severe drought in this area.

2.2 Understanding the Bee Mortality Dataset

This section explores the characteristics of the bee mortality dataset, including its sources, key variables, and structure.

The dataset is sourced from the TidyTuesday repository and provides insights into colony losses and stressors affecting honeybee populations across the United States over time.

2.2.1 Dataset Structure

The bee mortality data consists of two related datasets:
1. colony.csv: Contains data on the number of bee colonies, their losses, and related statistics.
2. stressor.csv: Focuses on stressors affecting the colonies, including pests, diseases, and environmental factors.

Both datasets covers data from 2015 to 2021, with all U.S. states included.

2.2.2 Insights in the colony.csv dataset:

The colony.csv dataset contains several key variables that provide detailed insights into bee colony dynamics over time. The year variable indicates the year of observation, while months specifies the time period within the year, such as January to March. The state variable identifies the U.S. state being observed, allowing for geographic analysis of bee colonies.

Data on colony numbers is captured in several fields: colony_n records the number of colonies at the start of the period, and colony_max represents the maximum number of colonies during the same timeframe. The dataset also tracks losses and additions to colonies, with colony_lost detailing the number of colonies lost and colony_lost_pct expressing this loss as a percentage. Similarly, colony_added reflects the number of colonies added during the period.

Efforts to improve or maintain colonies are represented by colony_reno, which shows the number of colonies renovated, and colony_reno_pct, which provides the percentage of colonies that underwent renovation.

To better understand the data, the following table provides a preview of the colony.csv dataset:
Preview of the bee mortality dataset (colony.csv)
year months state colony_n colony_max colony_lost colony_lost_pct colony_added colony_reno colony_reno_pct
2015 January-March Alabama 7000 7000 1800 26 2800 250 4
2015 January-March Arizona 35000 35000 4600 13 3400 2100 6
2015 January-March Arkansas 13000 14000 1500 11 1200 90 1
2015 January-March California 1440000 1690000 255000 15 250000 124000 7
2015 January-March Colorado 3500 12500 1500 12 200 140 1
2015 January-March Connecticut 3900 3900 870 22 290 NA NA

In the third row of the table, the data pertains to Arkansas during the period of January–March 2015. The colony_n value shows that the state started with 13,000 colonies, which increased to a maximum of 14,000 (colony_max). However, 1,500 colonies were lost during this time (colony_lost), accounting for an 11% loss (colony_lost_pct). Arkansas added 1,200 colonies (colony_added) and renovated 90 colonies (colony_reno), representing 1% of colonies renovated (colony_reno_pct).

2.2.3 Insights in the stressor.csv dataset:

The stressor.csv dataset captures key information about the factors affecting bee colonies across the United States. It includes the variable year, representing the year of observation, and the variable months, specifying the time period within that year. Observations are categorized by state, providing insights into regional differences in the challenges faced by bee populations. The dataset also identifies specific stressor types, such as Varroa mites or pesticides, and quantifies their impact through the stress_pct variable, which represents the percentage of colonies affected.

The following table provides a preview of the stressor.csv dataset:
Preview of the stressor dataset (stressor.csv)
year months state stressor stress_pct
2015 January-March Alabama Varroa mites 10.0
2015 January-March Alabama Other pests/parasites 5.4
2015 January-March Alabama Diseases NA
2015 January-March Alabama Pesticides 2.2
2015 January-March Alabama Other 9.1
2015 January-March Alabama Unknown 9.4

In the first row of the table, the data pertains to Alabama during January–March 2015. The stressor is “Varroa mites,” which impacted 10.0% (stress_pct) of the bee colonies during this time. Varroa mites are a significant stressor known to harm bee health and contribute to colony losses.

3 Our Hypothesis

Drought conditions negatively impact the availability of forage resources, such as flowers, for bees, thereby reducing their food supply and increasing stress on bee populations. As a result, we expect that areas experiencing more severe drought conditions (as indicated by higher DSCI values) will show higher percentages of stressed colonies or even lost colonies.

However, this expected correlation is also influenced by the region and season. In some regions, the impact of drought on bee colonies will be more severe due to factors like local climate, typical drought frequency, and forage availability.

3.1 Important variables

To test our hypothesis, we rely on several key variables from the datasets:

  • D0 - D4 and W0 - W4: From the drought.csv dataset
    These variables represent drought severity (D0 to D4) and wetness levels (W0 to W4), which allow us to assess the impact of drought and moisture conditions on bee health.

  • colony_lost: From the colony.csv dataset
    This variable indicates the number of colonies lost during a given period, which is crucial for understanding the relationship between drought conditions and colony stress.

  • stress_pct: From the stressor.csv dataset
    This variable shows the percentage of colonies affected by various stressors, such as drought or pests, helping us measure the stress on bee populations.

  • state and date/months/year: From both the drought.csv and stressor.csv datasets
    These variables provide important regional and temporal context, enabling us to explore seasonal and regional variations in drought impact on bee colonies.

4 Preprocessing

In this chapter, we focus on preparing the datasets introduced in Chapter Data Overview for subsequent analysis.
First, variables are standardized to ensure consistent naming conventions and formats. Next, the data is filtered to align with the common time period. Following this, relevant datasets are merged and finally, any missing data is addressed.

4.1 Standardizing Variable Names and Formats

The drought.csv dataset initially stored dates in a single variable, formatted as d_year|month|day while the drought_fips.csv dataset stores year, month and day as separate variables. Therefore this format was restructured into three separate variables: year, month, and day.

Here is a glimpse of the transformed drought.csv dataset:

Preview of the transformed drought dataset
0 DATE D0 D1 D2 D3 D4 -9 W0 W1 W2 W3 W4 state year month day
0 d_18950101 0 0 0 0 0 100 0 0 0 0 0 alabama 1895 January 01

In the drought_fips dataset, months are represented numerically, and state names are abbreviated. To ensure consistency, the data has been transformed to use full month names and state names written in full.
Below is a preview of the transformed dataset:

Preview of the transformed drought dataset
state FIPS DSCI year month day
alaska 02013 0 2000 January 04

Now, all shared variables across the drought.csv, drought_fips.csv, and colony.csv datasets have been standardized to follow a consistent naming convention and format. This standardization ensures compatibility, allowing the datasets to be merged seamlessly for comprehensive analysis.

4.2 Connecting Datasets: Temporal Overlap

To ensure the datasets are compatible for analysis, it is important to align their time periods. The colony.csv dataset spans the years 2015 to 2021, while the drought.csv and drought_fips.csv datasets cover a broader time range.
This filtering step ensures that all observations align temporally, therefore removing all data outside this 2015 to 2021 range.

Summary of the drought Dataset Before and After Filtering
Stage Rows Date_Range
Before Filtering 73344 1895 - 2022
After Filtering 3792 2015 - 2021
Summary of the drought_fips Dataset Before and After Filtering
Stage Rows Date_Range
Before Filtering 3771791 2000 - 2022
After Filtering 1104803 2015 - 2021

4.3 Combining the data

Now that all variable names are standardized and the time spans of the datasets are aligned, they can be seamlessly combined into a single dataset. However, there is a difference in the level of detail in the time data across the datasets. The drought_fips.csv dataset includes multiple data points within each month, whereas the drought.csv dataset records data only on the first day of each month.

Upon further investigation, it was determined that the drought dataset is based on weekly updates, as detailed on the U.S. Drought Monitor website. The data recorded on the first day of each month appears to represent an aggregated value for the preceding month.

To facilitate merging the drought datasets, the entries in the drought_fips.csv dataset are averaged for each month and year. The resulting dataset sets the day variable to “01” for each entry, aligning with the temporal structure of the drought data.

Here is a side-by-side comparison to illustrate the changes made to the dataset:
Preview of the drought fips dataset before averaging
state FIPS DSCI year month day
alaska 02013 0 2015 January 06
alaska 02013 0 2015 January 13
alaska 02013 0 2015 January 20
alaska 02013 0 2015 January 27
alaska 02013 0 2015 February 03
Preview of the drought fips dataset after averaging
state FIPS avg_DSCI year month day
alabama 01001 50.0 2015 April 01
alabama 01001 4.5 2015 August 01
alabama 01001 0.0 2015 December 01
alabama 01001 100.0 2015 February 01
alabama 01001 50.0 2015 January 01

The drought-related datasets are now combined into a single, unified dataset:

A preview of the combined dataset is shown below:
Preview of the combined drought dataset
0 DATE D0 D1 D2 D3 D4 -9 W0 W1 W2 W3 W4 state year month day FIPS avg_DSCI
49.5 d_20150101 40.6 21.5 1.1 0.1 0 0 9.8 3.8 0.1 0 0 alabama 2015 January 01 01001 50.0
49.5 d_20150101 40.6 21.5 1.1 0.1 0 0 9.8 3.8 0.1 0 0 alabama 2015 January 01 01003 157.5
49.5 d_20150101 40.6 21.5 1.1 0.1 0 0 9.8 3.8 0.1 0 0 alabama 2015 January 01 01005 47.0
49.5 d_20150101 40.6 21.5 1.1 0.1 0 0 9.8 3.8 0.1 0 0 alabama 2015 January 01 01007 0.0
49.5 d_20150101 40.6 21.5 1.1 0.1 0 0 9.8 3.8 0.1 0 0 alabama 2015 January 01 01009 0.0

To align the combined dataset with the colony.csv dataset, it is necessary to aggregate the data by quarters, as the colony.csv dataset contains values for the following periods: January-March, April-June, July-September, and October-December. Consequently, the variables D0-D4, -9, W0-W4, and the previously averaged avg_DSCI must be averaged across the respective periods.

The following provides a preview:
Preview of the averaged combined drought dataset
state year months avg_D0 avg_D1 avg_D2 avg_D3 avg_minus9 avg_W0 avg_W1 avg_W2 avg_W3 avg_W4 avg_DSCI
alabama 2015 April-June 20.70000 6.7000000 0.0666667 0.0000000 0 16.133333 3.400000 0.1333333 0.00000 0.000000 36.84080
alabama 2015 January-March 53.86667 40.1666667 18.6666667 7.1666667 0 8.433333 3.566667 0.3666667 0.00000 0.000000 48.83557
alabama 2015 July-September 34.03333 10.6000000 0.5333333 0.0333333 0 6.333333 1.500000 0.0000000 0.00000 0.000000 57.57786
alabama 2015 October-December 12.50000 3.5000000 0.1666667 0.0000000 0 39.700000 29.633333 17.1000000 10.43333 5.600000 29.27587
alabama 2016 April-June 1.00000 0.1666667 0.0000000 0.0000000 0 75.566667 59.766667 28.6000000 14.36667 3.033333 56.16891

Finally, all relevant datasets are consolidated into a single unified dataset.

Below is a preview of its current structure:

4.4 Missing data

Before delving into the analysis, it is crucial to evaluate data completeness. Missing values can affect both accuracy and reliability, making it important to first determine how many rows contain ‘NA’ values across the datasets.

## [1] 613

A total of 613 missing values are present, distributed as shown in the table below.

The following displays a line with missing data in it. in this example the variable colony_reno_pct is missing.

After identifying the missing values, the next step is to remove the rows containing any missing data. To ensure that no missing values remain in the dataset, the total count of missing values is recalculated, which should yield zero.

## [1] 0

5 Exploring the datasets

First, the data on bee colony mortality is examined. The following visualization illustrates colony loss percentages across U.S. states over multiple years, capturing both temporal and spatial trends. A color gradient is used, with blue representing low loss rates and yellow indicating high loss rates. Most states show colony loss percentages between 10% and 20%, indicating relatively stable losses rather than drastic changes. Only in a few states do the values rise significantly, reaching higher percentages. These exceptions might indicate regions where colony loss could driven by specific agricultural factors.

The below graph provides additional insight into the percentage of colony loss across various U.S. states from 2015 to 2021. In this graph, we can clearly see that most states experience colony loss percentages between 10% and 20%, with only few stages showing occasional spikes above this range.


The Drought data can be visualized in a similar manner, using the Drought Severity and Coverage Index (DSCI) as a measure of drought intensity and extent. The DSCI ranges from 0 (indicating no drought) to 500 (representing extreme drought conditions). The visualization clearly highlights a regional pattern, with significantly more severe drought conditions in the western United States compared to the eastern regions.

Here, the DSCI is depicted across all years for all states.


Below, interactive buttons provide access to state-specific visualizations, allowing for a detailed examination of the relationship between colony loss percentages and drought conditions. Clicking on a button reveals two plots for the selected state. The first plot illustrates the trend of colony loss percentages alongside the Drought Severity and Coverage Index (DSCI) over time, offering insights into overall drought severity. The second plot presents colony loss percentages in relation to the drought levels D0-D3, enabling a more granular comparison of different drought intensities.
Feel free to explore the data by selecting different states to uncover potential patterns and regional variations in bee colony losses and drought conditions.

6 Analysis

Looking at the data, there does not seen to be a clear correlation between drought severity and bee colony losses. In certain cases, such as in Maine from 2016 to 2018, an increase in drought severity appears to correspond with a rise in colony loss percentage. However, this pattern is not consistently observed across all states and time periods, suggesting that additional factors may influence colony losses beyond drought conditions alone.

For example, in Mississippi from 2016 to 2018, there appears to be no noticeable effect of drought on colony losses. Despite a significant peak in drought severity during this period, colony loss percentages remain relatively stable.

In some cases, such as in Illinois, colony losses even exhibit seemingly random fluctuations with no clear connection to drought levels.

This indicates that colony loss is likely driven by multiple factors beyond just drought severity.

This is further reflected in the correlation coefficients between the percentage of colonies lost and drought levels (D0-D3). A selection of these coefficients for various states is presented in the table below.

Pearson Correlation Between Colony Loss and Drought Levels (D0-D3)
State D0 D1 D2 D3
Alabama -0.023 0.007 0.031 0.024
Arizona 0.275 0.234 0.144 0.11
Arkansas 0.113 0.128 0.095 0.067
California -0.266 -0.319 -0.315 -0.301
Colorado 0.138 0.138 0.16 0.16
Connecticut 0.184 0.085 0.048 0.001
Florida -0.302 -0.313 -0.382 -0.382
Georgia -0.241 -0.264 -0.282 -0.277
Maine 0.1 0.146 0.158 0.182
Mississippi -0.359 -0.407 -0.365 -0.327
Illinois 0.236 0.188 0.094 0.183

The correlation coefficient (r) is a statistical measure that quantifies the strength and direction of the relationship between two variables. A value of r = 1 indicates a perfect positive correlation, meaning that as one variable increases, the other also increases in a perfectly linear manner. Conversely, r = -1 represents a perfect negative correlation, where an increase in one variable corresponds to a decrease in the other. A value of r = 0 suggests no linear relationship between the variables. Based on the correlation values presented, there appears to be little to no consistent relationship between drought severity and bee colony mortality.

7 Conclusion

As mentioned above, our hypothesis suggested a link between drought severity and colony losses with the expectation that higher DSCI values would correspond to increased colony loss percentages. But based on our analysis, while drought conditions may contribute to colony stress in certain cases, they do not consistently drive colony losses on their own. The results suggest drought alone is not a reliable predictor of colony loss. Instead, multiple factors likely interact to influence bee population declines, underscoring the complexity of this issue and highlighting the need for a multifactorial approach in future research and conservation efforts.

References

Conte, Y. Le, and M. Navajas. 2008. Climate Change: Impact on Honey Bee Populations and Diseases.” Rev Sci Tech 27 (2): 485–97, 499–510.
Rankin, Erin E. Wilson, Sarah K. Barney, and Giselle E. Lozano. 2020. “Reduced Water Negatively Impacts Social Bee Survival and Productivity via Shifts in Floral Nutrition.” Journal of Insect Science 20 (5): 15. https://doi.org/10.1093/jisesa/ieaa114.
Syngenta. 2021. “The Importance of Bees in Biodiversity Stewardship.” https://www.syngenta-us.com/biodiversity-stewardship/bees/.
LS0tDQp0aXRsZTogIldoZW4gdGhlIFJhaW4gU3RvcHM6IEhvdyBEbyBEcm91Z2h0cyBJbmZsdWVuY2UgQmVlIE1vcnRhbGl0eT8iDQphdXRob3I6ICJDZWRyaWMgQmlsZ2VyLCBIb2FuZyBUcmFuZyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFKQ0KDQpvcHRpb25zKHNjaXBlbiA9IDE1KQ0KDQoNCmBgYA0KDQoNCmBgYHtyIGxvYWQtd3JhbmdsZS1kYXRhLCBlY2hvID0gRkFMU0V9DQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQp9DQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQpkcm91Z2h0X3BhdGggPC0gIi4vZGF0YS9kcm91Z2h0LyINCmJlZV9wYXRoIDwtICIuL2RhdGEvYmVlLyINCg0KaXNfZm9sZGVyX2VtcHR5IDwtIGZ1bmN0aW9uKGZvbGRlcikgew0KICBsZW5ndGgobGlzdC5maWxlcyhmb2xkZXIsIHJlY3Vyc2l2ZSA9IFRSVUUpKSA9PSAwDQp9DQoNCmlmIChpc19mb2xkZXJfZW1wdHkoZHJvdWdodF9wYXRoKSkgew0KICBkcm91Z2h0X3VybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYWluL2RhdGEvMjAyMi8yMDIyLTA2LTE0L2Ryb3VnaHQuY3N2Ig0KICBkcm91Z2h0X2ZpcHNfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21haW4vZGF0YS8yMDIyLzIwMjItMDYtMTQvZHJvdWdodC1maXBzLmNzdiINCiAgDQogIGRvd25sb2FkLmZpbGUoZHJvdWdodF91cmwsIGRlc3RmaWxlID0gcGFzdGUwKGRyb3VnaHRfcGF0aCwgImRyb3VnaHQuY3N2IikpDQogIGRvd25sb2FkLmZpbGUoZHJvdWdodF9maXBzX3VybCwgZGVzdGZpbGUgPSBwYXN0ZTAoZHJvdWdodF9wYXRoLCAiZHJvdWdodC1maXBzLmNzdiIpKQ0KfQ0KDQppZiAoaXNfZm9sZGVyX2VtcHR5KGJlZV9wYXRoKSkgew0KICBjb2xvbnlfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21haW4vZGF0YS8yMDIyLzIwMjItMDEtMTEvY29sb255LmNzdiINCiAgc3RyZXNzb3JfdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21haW4vZGF0YS8yMDIyLzIwMjItMDEtMTEvc3RyZXNzb3IuY3N2Ig0KICANCiAgZG93bmxvYWQuZmlsZShjb2xvbnlfdXJsLCBkZXN0ZmlsZSA9IHBhc3RlMChiZWVfcGF0aCwgImNvbG9ueS5jc3YiKSkNCiAgZG93bmxvYWQuZmlsZShzdHJlc3Nvcl91cmwsIGRlc3RmaWxlID0gcGFzdGUwKGJlZV9wYXRoLCAic3RyZXNzb3IuY3N2IikpDQp9DQoNCiMgTG9hZCB0aGUgZGF0YXNldHMNCmRyb3VnaHQgPC0gcmVhZF9jc3YocGFzdGUwKGRyb3VnaHRfcGF0aCwgImRyb3VnaHQuY3N2IikpDQpkcm91Z2h0X2ZpcHMgPC0gcmVhZF9jc3YocGFzdGUwKGRyb3VnaHRfcGF0aCwgImRyb3VnaHQtZmlwcy5jc3YiKSkNCmNvbG9ueSA8LSByZWFkX2NzdihwYXN0ZTAoYmVlX3BhdGgsICJjb2xvbnkuY3N2IikpDQpzdHJlc3NvciA8LSByZWFkX2NzdihwYXN0ZTAoYmVlX3BhdGgsICJzdHJlc3Nvci5jc3YiKSkNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KQmVlcyBhcmUgZXNzZW50aWFsIGZvciBtYWludGFpbmluZyBlY29zeXN0ZW1zIGFuZCBzdXBwb3J0aW5nIHRoZSBoZWFsdGggb2YgdGhlIGJpb3NwaGVyZSB0aHJvdWdoIHRoZWlyIHJvbGUgaW4gcG9sbGluYXRpb24uIEJlZXMgYXJlIGtleSBwb2xsaW5hdG9ycyBmb3IgbWFueSBmcnVpdHMsIHZlZ2V0YWJsZXMsIG51dHMsIGFuZCBzZWVkcy4gQXBwcm94aW1hdGVseSBvbmUtdGhpcmQgb2YgdGhlIGh1bWFuIGZvb2Qgc3VwcGx5IGRlcGVuZHMgb24gaW5zZWN0IHBvbGxpbmF0aW9uLCBwcmVkb21pbmFudGx5IGJ5IGJlZXMgW0BzeW5nZW50YTIwMjFdLiBUaGlzIHVuZGVyc2NvcmVzIHdoeSB0aGUgRXVyb3BlYW4gaG9uZXkgYmVlIGlzIGNvbnNpZGVyZWQgdGhlIG1vc3QgZWNvbm9taWNhbGx5IGltcG9ydGFudCBwb2xsaW5hdG9yIGZvciBhZ3JpY3VsdHVyYWwgY3JvcHMgd29ybGR3aWRlIFtATGVDb250ZTIwMDhdLjxicj4NCjxicj4NCkluIHJlY2VudCB5ZWFycywgaG93ZXZlciwgYmVlIG1vcnRhbGl0eSBhbmQgdGhlIGRlY2xpbmUgb2YgYmVlIGNvbG9uaWVzIGhhdmUgcmFpc2VkIHNlcmlvdXMgY29uY2VybnMuIFRoaXMgYWxhcm1pbmcgdHJlbmQgaXMgZHJpdmVuIGJ5IGEgdmFyaWV0eSBvZiBmYWN0b3JzLCB3aXRoIGNsaW1hdGUgY2hhbmdlIGVtZXJnaW5nIGFzIGEgc2lnbmlmaWNhbnQgdGhyZWF0LiBDbGltYXRlIGNoYW5nZSBpbnRyb2R1Y2VzIG11bHRpcGxlIHN0cmVzc29ycywgaW5jbHVkaW5nIHJpc2luZyB0ZW1wZXJhdHVyZXMgYW5kIGFuIGluY3JlYXNpbmcgZnJlcXVlbmN5IG9mIGRyb3VnaHRzIFtAcmFua2luMjAyMF0uPGJyPg0KPGJyPg0KVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGltcGFjdCBvZiBjbGltYXRlIGNoYW5nZSBvbiBiZWUgcG9wdWxhdGlvbnMsIGl0IGlzIGNydWNpYWwgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW52aXJvbm1lbnRhbCBzdHJlc3NvcnMgYW5kIGJlZSBtb3J0YWxpdHkgcmF0ZXMuIEFtb25nIHRoZXNlIHN0cmVzc29ycywgZHJvdWdodHMgbWF5IHBsYXkgYSBzaWduaWZpY2FudCByb2xlIGR1ZSB0byB0aGVpciBwb3RlbnRpYWwgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBhY3RzIG9uIGZsb3JhbCByZXNvdXJjZXMgYW5kIGhhYml0YXQgYXZhaWxhYmlsaXR5LiBJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCB0aGUgZGF0YSBpcyBwcmVzZW50ZWQgYW5kIGFuYWx5emVkIHRvIGV4cGxvcmUgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBkcm91Z2h0cyBhbmQgYmVlIG1vcnRhbGl0eS48YnI+DQo8YnI+DQoNCiMgRGF0YSBPdmVydmlldyAgDQoNCiMjIFVuZGVyc3RhbmRpbmcgdGhlIERyb3VnaHQgRGF0YXNldCAgDQpUaGlzIHNlY3Rpb24gZGVsdmVzIGludG8gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZHJvdWdodCBkYXRhLCBpbmNsdWRpbmcgaXRzIHNvdXJjZXMsIGtleSB2YXJpYWJsZXMsIGFuZCB0ZW1wb3JhbCBjb3ZlcmFnZS48YnI+ICANClRoZSBkYXRhc2V0IGlzIHNvdXJjZWQgZnJvbSB0aGUgW1RpZHlUdWVzZGF5IHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvdHJlZS9tYWluL2RhdGEvMjAyMi8yMDIyLTA2LTE0KSBhbmQgd2FzIG9yaWdpbmFsbHkgY29tcGlsZWQgYnkgdGhlIE5hdGlvbmFsIEludGVncmF0ZWQgRHJvdWdodCBJbmZvcm1hdGlvbiBTeXN0ZW0gKE5JRElTKS48YnI+ICANCg0KIyMjIERhdGFzZXQgU3RydWN0dXJlICANClRoZSBkcm91Z2h0IGRhdGEgY29uc2lzdHMgb2YgdHdvIHJlbGF0ZWQgZGF0YXNldHM6ICANCjEuICoqYGRyb3VnaHQuY3N2YCoqOiBTdGF0ZS1sZXZlbCBkYXRhIG9uIGRyb3VnaHQgYW5kIHdldG5lc3MgY29uZGl0aW9ucyBvdmVyIHRpbWUuPGJyPg0KMi4gKipgZHJvdWdodF9maXBzLmNzdmAqKjogQ291bnR5LWxldmVsIGRhdGEgb24gZHJvdWdodCBjb25kaXRpb25zIHVzaW5nIEZJUFMgY29kZXMgZm9yIGxvY2FsaXplZCBhbmFseXNpcy4gPGJyPg0KDQpUaGVzZSBkYXRhc2V0cyBwcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRyb3VnaHQgZnJlcXVlbmN5IGFuZCBpbnRlbnNpdHkgYWNyb3NzIGRpZmZlcmVudCByZWdpb25zIGFuZCB0aW1lIHBlcmlvZHMgd2l0aGluIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGUgZGF0YSBwb2ludHMgYXJlIHRha2VuIGRhaWx5IG92ZXIgYSBzcGFuIGZyb20gdGhlIHllYXIgMTg5NSB0byB0aGUgcHJlc2VudC4gPGJyPg0KDQojIyMgSW5zaWdodHMgaW4gdGhlICoqYGRyb3VnaHQuY3N2YCoqIGRhdGFzZXQ6DQpLZXkgdmFyaWFibGVzIGluY2x1ZGUgYERBVEVgLCB3aGljaCByZWNvcmRzIHRoZSBkYXRlIG9mIG9ic2VydmF0aW9uLCBhbmQgc2V2ZXJpdHkgbGV2ZWxzIHN1Y2ggYXMgYEQwYCAoYWJub3JtYWxseSBkcnkpLCBgRDFgIChtb2RlcmF0ZSBkcm91Z2h0KSwgYEQyYCAoc2V2ZXJlIGRyb3VnaHQpLCBgRDNgIChleHRyZW1lIGRyb3VnaHQpLCBhbmQgYEQ0YCAoZXhjZXB0aW9uYWwgZHJvdWdodCkuIFNpbWlsYXJseSwgYFcwYCB0byBgVzRgIHRyYWNrIHdldG5lc3MgbGV2ZWxzLiB3aXRoIGBXMGAgcmVwcmVzZW50aW5nIHRoZSBsZWFzdCB3ZXQgY29uZGl0aW9ucyBhbmQgYFc0YCBpbmRpY2F0aW5nIHRoZSB3ZXR0ZXN0IGNvbmRpdGlvbnMuIFRoZSBgc3RhdGVgIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbG9jYXRpb24uPGJyPg0KDQpUbyBwcm92aWRlIGEgY2xvc2VyIGxvb2ssIHRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgYSBwcmV2aWV3IG9mIHRoZSBkYXRhOg0KYGBge3IgZ2xpbXBzZS1vZi1kYXRhLCBlY2hvID0gRkFMU0V9DQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrYWJsZUV4dHJhIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQp9DQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgU2VsZWN0IGludGVyZXN0aW5nIHJvd3MNCnNlbGVjdGVkX3Jvd3MgPC0gZHJvdWdodFsxMDAwOjEwMTAsIF0NCg0KIyBEaXNwbGF5IHJvd3MgYXMgdGFibGUNCnNlbGVjdGVkX3Jvd3MgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlByZXZpZXcgb2YgdGhlIGRyb3VnaHQgZGF0YXNldCAoYGRyb3VnaHQuY3N2YCkiKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lDQogIHJvd19zcGVjKDQsIGJhY2tncm91bmQgPSAiI0ZGRkZDQyIpDQpgYGANCg0KV2UgY2FuIHNlZSB0aGF0LCBmb3IgZXhhbXBsZSwgaW4gdGhlIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOyI+Zm91cnRoIHJvdzwvc3Bhbj4gb2YgdGhlIHRhYmxlLCBBbGFiYW1hIGV4cGVyaWVuY2VkIHNpZ25pZmljYW50IGRyb3VnaHQgY29uZGl0aW9ucyBvbiBKdWx5IDEsIDE5NzguIE9uIHRoaXMgZGF0ZSwgMzQuMSUgb2YgdGhlIHN0YXRlIHdhcyBjYXRlZ29yaXplZCBhcyBhYm5vcm1hbGx5IGRyeSAoYEQwYCksIDE4LjklIGFzIG1vZGVyYXRlIGRyb3VnaHQgKGBEMWApLCBhbmQgMi41JSBhcyBzZXZlcmUgZHJvdWdodCAoYEQyYCkuIE5vIGFyZWFzIHdlcmUgcmVjb3JkZWQgdW5kZXIgZXh0cmVtZSBkcm91Z2h0IChgRDNgKSBvciBleGNlcHRpb25hbCBkcm91Z2h0IChgRDRgKS4NCg0KT24gdGhlIHdldG5lc3Mgc2lkZSwgMjUuMCUgb2YgdGhlIHN0YXRlIHdhcyB1bmRlciBsZWFzdCB3ZXQgY29uZGl0aW9ucyAoYFcwYCksIDIxLjAlIHVuZGVyIG1vZGVyYXRlbHkgd2V0IGNvbmRpdGlvbnMgKGBXMWApLCA5LjUlIHVuZGVyIHZlcnkgd2V0IGNvbmRpdGlvbnMgKGBXMmApLCBhbmQgMy42JSB1bmRlciBleHRyZW1lbHkgd2V0IGNvbmRpdGlvbnMgKGBXM2ApLiBBIHNtYWxsIHBvcnRpb24gKDEuNSUpIG9mIHRoZSBzdGF0ZSBmZWxsIGludG8gdGhlIHdldHRlc3QgY29uZGl0aW9ucyAoYFc0YCkgY2F0ZWdvcnksIGluZGljYXRpbmcgdGhlIGhpZ2hlc3QgbGV2ZWxzIG9mIHdldG5lc3MgZHVyaW5nIHRoaXMgdGltZS4NCg0KVGhlIGF0dGVudGl2ZSByZWFkZXIgbWF5IGhhdmUgbm90aWNlZCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBgMGAgYW5kIGAtOWAgY29sdW1ucyBpbiB0aGUgZGF0YXNldC4gVGhlc2UgY29sdW1ucyBzZXJ2ZSBhbiBpbXBvcnRhbnQgcHVycG9zZSBpbiBpbnRlcnByZXRpbmcgdGhlIGRhdGEuIFRoZSBgMGAgY29sdW1uIGluZGljYXRlcyB0aGUgdG90YWwgcGVyY2VudGFnZSBvZiB0aGUgc3RhdGUgZXhwZXJpZW5jaW5nIGFueSBmb3JtIG9mIGRyb3VnaHQgY29uZGl0aW9ucy4gRm9yIGV4YW1wbGUsIGluIHRoaXMgY2FzZSwgaXQgc2hvd3MgNDEuMCUgZm9yIEFsYWJhbWEgb24gSnVseSAxLCAxOTc4LCByZXByZXNlbnRpbmcgdGhlIGNvbWJpbmVkIHBlcmNlbnRhZ2Ugb2YgdGhlIHN0YXRlIGNhdGVnb3JpemVkIHVuZGVyIGBEMGAgdGhyb3VnaCBgRDRgLg0KDQpPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGAtOWAgY29sdW1uIGNhcHR1cmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzdGF0ZSBmb3Igd2hpY2ggbm8gZGF0YSB3YXMgYXZhaWxhYmxlLiBUaGlzIGNvdWxkIGluY2x1ZGUgcmVnaW9ucyBub3QgbW9uaXRvcmVkIG9yIGV4Y2x1ZGVkIGZyb20gdGhlIGFuYWx5c2lzLiBGb3IgdGhpcyBwYXJ0aWN1bGFyIGRhdGUgYW5kIGxvY2F0aW9uLCB0aGUgYC05YCB2YWx1ZSBpcyAwJSwgbWVhbmluZyB0aGF0IGNvbXBsZXRlIGRhdGEgd2FzIHJlY29yZGVkIGZvciBBbGFiYW1hLjxicj4NCjxicj4NCg0KIyMjIEluc2lnaHRzIGluIHRoZSAqKmBkcm91Z2h0X2ZpcHMuY3N2YCoqIGRhdGFzZXQ6DQpJbiBhZGRpdGlvbiB0byB0aGUgbWFpbiBkcm91Z2h0IGRhdGFzZXQsICoqYGRyb3VnaHQuY3N2YCoqLCB0aGUgKipgZHJvdWdodF9maXBzLmNzdmAqKiBkYXRhc2V0IHByb3ZpZGVzIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRyb3VnaHQgY29uZGl0aW9ucyBjYXRlZ29yaXplZCBieSB0aGUgRmVkZXJhbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIFN0YW5kYXJkcyAoRklQUykgY29kZSwgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZ2VvZ3JhcGhpY2FsIHJlZ2lvbnMgd2l0aGluIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGlzIGFkZGl0aW9uYWwgZGF0YSBhbGxvd3MgZm9yIGEgbW9yZSBncmFudWxhciBhbmFseXNpcyBvZiBkcm91Z2h0IGNvbmRpdGlvbnMgYXQgdGhlIGNvdW50eSBvciByZWdpb24gbGV2ZWwsIGhlbHBpbmcgdG8gdHJhY2sgbG9jYWxpemVkIGRyb3VnaHQgdHJlbmRzIG92ZXIgdGltZS4NCg0KVG8gaWxsdXN0cmF0ZSB0aGlzIGZ1cnRoZXIsIHRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgYSBwcmV2aWV3IG9mIHRoZSAqKmBkcm91Z2h0X2ZpcHMuY3N2YCoqIGRhdGFzZXQ6DQpgYGB7ciBnbGltcHNlLW9mLWZpcHMtZGF0YSwgZWNobyA9IEZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBTZWxlY3QgaW50ZXJlc3Rpbmcgcm93cw0Kc2VsZWN0ZWRfcm93cyA8LSBkcm91Z2h0X2ZpcHNbMzY2NjA6MzY2NjUsIF0NCg0KIyBEaXNwbGF5IHJvd3MgYXMgdGFibGUNCnNlbGVjdGVkX3Jvd3MgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlByZXZpZXcgb2YgdGhlIGRyb3VnaHQtZmlwcyBkYXRhc2V0IChgZHJvdWdodF9maXBzLmNzdmApIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGRkZGQ0MiKQ0KYGBgDQoNCkZvciBpbnN0YW5jZSwgbG9va2luZyBhdCB0aGUgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7Ij5zZWNvbmQgcm93PC9zcGFuPiBvZiB0aGUgdGFibGUsIHRoZSBgRklQU2AgY29kZSAwMTAwMyBjb3JyZXNwb25kcyB0byBCYWxkd2luIENvdW50eSBpbiBBbGFiYW1hLCBhcyBjb25maXJtZWQgYnkgdGhlIGBzdGF0ZWAgY29sdW1uIHNob3dpbmcgQUwuIFRoZSBEU0NJIChEcm91Z2h0IFNldmVyaXR5IGFuZCBDb3ZlcmFnZSBJbmRleCkgaXMgYSBtZWFzdXJlIHVzZWQgdG8gYXNzZXNzIHRoZSBzZXZlcml0eSBhbmQgZXh0ZW50IG9mIGRyb3VnaHQgY29uZGl0aW9ucywgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIDAgKG5vIGRyb3VnaHQpIHRvIDUwMCAoZXh0cmVtZSBkcm91Z2h0KS4gT24gTm92ZW1iZXIgMjEsIDIwMDYsIHRoZSBEU0NJIHZhbHVlIGZvciBCYWxkd2luIENvdW50eSBpcyByZWNvcmRlZCBhcyA4NywgaW5kaWNhdGluZyBhIG1vZGVyYXRlbHkgc2V2ZXJlIGRyb3VnaHQgaW4gdGhpcyBhcmVhLiA8YnI+DQoNCiMjIFVuZGVyc3RhbmRpbmcgdGhlIEJlZSBNb3J0YWxpdHkgRGF0YXNldCAgDQpUaGlzIHNlY3Rpb24gZXhwbG9yZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmVlIG1vcnRhbGl0eSBkYXRhc2V0LCBpbmNsdWRpbmcgaXRzIHNvdXJjZXMsIGtleSB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmUuPGJyPiAgDQpUaGUgZGF0YXNldCBpcyBzb3VyY2VkIGZyb20gdGhlIFtUaWR5VHVlc2RheSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L2Jsb2IvbWFpbi9kYXRhLzIwMjIvMjAyMi0wMS0xMS9yZWFkbWUubWQpIGFuZCBwcm92aWRlcyBpbnNpZ2h0cyBpbnRvIGNvbG9ueSBsb3NzZXMgYW5kIHN0cmVzc29ycyBhZmZlY3RpbmcgaG9uZXliZWUgcG9wdWxhdGlvbnMgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzIG92ZXIgdGltZS48YnI+DQoNCiMjIyBEYXRhc2V0IFN0cnVjdHVyZSAgDQpUaGUgYmVlIG1vcnRhbGl0eSBkYXRhIGNvbnNpc3RzIG9mIHR3byByZWxhdGVkIGRhdGFzZXRzOiAgDQoxLiAqKmBjb2xvbnkuY3N2YCoqOiBDb250YWlucyBkYXRhIG9uIHRoZSBudW1iZXIgb2YgYmVlIGNvbG9uaWVzLCB0aGVpciBsb3NzZXMsIGFuZCByZWxhdGVkIHN0YXRpc3RpY3MuICANCjIuICoqYHN0cmVzc29yLmNzdmAqKjogRm9jdXNlcyBvbiBzdHJlc3NvcnMgYWZmZWN0aW5nIHRoZSBjb2xvbmllcywgaW5jbHVkaW5nIHBlc3RzLCBkaXNlYXNlcywgYW5kIGVudmlyb25tZW50YWwgZmFjdG9ycy48YnI+DQoNCkJvdGggZGF0YXNldHMgY292ZXJzIGRhdGEgZnJvbSAyMDE1IHRvIDIwMjEsIHdpdGggYWxsIFUuUy4gc3RhdGVzIGluY2x1ZGVkLjxicj4NCg0KIyMjIEluc2lnaHRzIGluIHRoZSAqKmBjb2xvbnkuY3N2YCoqIGRhdGFzZXQ6ICANClRoZSAqKmBjb2xvbnkuY3N2YCoqIGRhdGFzZXQgY29udGFpbnMgc2V2ZXJhbCBrZXkgdmFyaWFibGVzIHRoYXQgcHJvdmlkZSBkZXRhaWxlZCBpbnNpZ2h0cyBpbnRvIGJlZSBjb2xvbnkgZHluYW1pY3Mgb3ZlciB0aW1lLiBUaGUgYHllYXJgIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgeWVhciBvZiBvYnNlcnZhdGlvbiwgd2hpbGUgbW9udGhzIHNwZWNpZmllcyB0aGUgdGltZSBwZXJpb2Qgd2l0aGluIHRoZSB5ZWFyLCBzdWNoIGFzIEphbnVhcnkgdG8gTWFyY2guIFRoZSBgc3RhdGVgIHZhcmlhYmxlIGlkZW50aWZpZXMgdGhlIFUuUy4gc3RhdGUgYmVpbmcgb2JzZXJ2ZWQsIGFsbG93aW5nIGZvciBnZW9ncmFwaGljIGFuYWx5c2lzIG9mIGJlZSBjb2xvbmllcy48YnI+DQo8YnI+DQpEYXRhIG9uIGNvbG9ueSBudW1iZXJzIGlzIGNhcHR1cmVkIGluIHNldmVyYWwgZmllbGRzOiBgY29sb255X25gIHJlY29yZHMgdGhlIG51bWJlciBvZiBjb2xvbmllcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHBlcmlvZCwgYW5kIGBjb2xvbnlfbWF4YCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xvbmllcyBkdXJpbmcgdGhlIHNhbWUgdGltZWZyYW1lLiBUaGUgZGF0YXNldCBhbHNvIHRyYWNrcyBsb3NzZXMgYW5kIGFkZGl0aW9ucyB0byBjb2xvbmllcywgd2l0aCBgY29sb255X2xvc3RgIGRldGFpbGluZyB0aGUgbnVtYmVyIG9mIGNvbG9uaWVzIGxvc3QgYW5kIGBjb2xvbnlfbG9zdF9wY3RgIGV4cHJlc3NpbmcgdGhpcyBsb3NzIGFzIGEgcGVyY2VudGFnZS4gU2ltaWxhcmx5LCBgY29sb255X2FkZGVkYCByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIGNvbG9uaWVzIGFkZGVkIGR1cmluZyB0aGUgcGVyaW9kLjxicj4NCjxicj4NCkVmZm9ydHMgdG8gaW1wcm92ZSBvciBtYWludGFpbiBjb2xvbmllcyBhcmUgcmVwcmVzZW50ZWQgYnkgYGNvbG9ueV9yZW5vYCwgd2hpY2ggc2hvd3MgdGhlIG51bWJlciBvZiBjb2xvbmllcyByZW5vdmF0ZWQsIGFuZCBgY29sb255X3Jlbm9fcGN0YCwgd2hpY2ggcHJvdmlkZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgY29sb25pZXMgdGhhdCB1bmRlcndlbnQgcmVub3ZhdGlvbi48YnI+DQoNClRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBkYXRhLCB0aGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGEgcHJldmlldyBvZiB0aGUgYGNvbG9ueS5jc3ZgIGRhdGFzZXQ6ICANCmBgYHtyIGdsaW1wc2Utb2YtY29sb255LWRhdGEsIGVjaG8gPSBGQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgRXhhbXBsZSByb3dzIGZyb20gY29sb255LmNzdg0KY29sb255X2V4YW1wbGUgPC0gZGF0YS5mcmFtZSgNCiAgeWVhciA9IGMoMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSksDQogIG1vbnRocyA9IGMoIkphbnVhcnktTWFyY2giLCAiSmFudWFyeS1NYXJjaCIsICJKYW51YXJ5LU1hcmNoIiwgIkphbnVhcnktTWFyY2giLCAiSmFudWFyeS1NYXJjaCIsICJKYW51YXJ5LU1hcmNoIiksDQogIHN0YXRlID0gYygiQWxhYmFtYSIsICJBcml6b25hIiwgIkFya2Fuc2FzIiwgIkNhbGlmb3JuaWEiLCAiQ29sb3JhZG8iLCAiQ29ubmVjdGljdXQiKSwNCiAgY29sb255X24gPSBjKDcwMDAsIDM1MDAwLCAxMzAwMCwgMTQ0MDAwMCwgMzUwMCwgMzkwMCksDQogIGNvbG9ueV9tYXggPSBjKDcwMDAsIDM1MDAwLCAxNDAwMCwgMTY5MDAwMCwgMTI1MDAsIDM5MDApLA0KICBjb2xvbnlfbG9zdCA9IGMoMTgwMCwgNDYwMCwgMTUwMCwgMjU1MDAwLCAxNTAwLCA4NzApLA0KICBjb2xvbnlfbG9zdF9wY3QgPSBjKDI2LCAxMywgMTEsIDE1LCAxMiwgMjIpLA0KICBjb2xvbnlfYWRkZWQgPSBjKDI4MDAsIDM0MDAsIDEyMDAsIDI1MDAwMCwgMjAwLCAyOTApLA0KICBjb2xvbnlfcmVubyA9IGMoMjUwLCAyMTAwLCA5MCwgMTI0MDAwLCAxNDAsIE5BKSwNCiAgY29sb255X3Jlbm9fcGN0ID0gYyg0LCA2LCAxLCA3LCAxLCBOQSkNCikNCg0KIyBEaXNwbGF5IHRhYmxlDQpjb2xvbnlfZXhhbXBsZSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJQcmV2aWV3IG9mIHRoZSBiZWUgbW9ydGFsaXR5IGRhdGFzZXQgKGBjb2xvbnkuY3N2YCkiKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lDQogIHJvd19zcGVjKDMsIGJhY2tncm91bmQgPSAiI0ZGRkZDQyIpDQpgYGANCg0KSW4gdGhlIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkNDOyI+dGhpcmQgcm93PC9zcGFuPiBvZiB0aGUgdGFibGUsIHRoZSBkYXRhIHBlcnRhaW5zIHRvIEFya2Fuc2FzIGR1cmluZyB0aGUgcGVyaW9kIG9mIEphbnVhcnnigJNNYXJjaCAyMDE1LiBUaGUgYGNvbG9ueV9uYCB2YWx1ZSBzaG93cyB0aGF0IHRoZSBzdGF0ZSBzdGFydGVkIHdpdGggMTMsMDAwIGNvbG9uaWVzLCB3aGljaCBpbmNyZWFzZWQgdG8gYSBtYXhpbXVtIG9mIDE0LDAwMCAoYGNvbG9ueV9tYXhgKS4gSG93ZXZlciwgMSw1MDAgY29sb25pZXMgd2VyZSBsb3N0IGR1cmluZyB0aGlzIHRpbWUgKGBjb2xvbnlfbG9zdGApLCBhY2NvdW50aW5nIGZvciBhbiAxMSUgbG9zcyAoYGNvbG9ueV9sb3N0X3BjdGApLiBBcmthbnNhcyBhZGRlZCAxLDIwMCBjb2xvbmllcyAoYGNvbG9ueV9hZGRlZGApIGFuZCByZW5vdmF0ZWQgOTAgY29sb25pZXMgKGBjb2xvbnlfcmVub2ApLCByZXByZXNlbnRpbmcgMSUgb2YgY29sb25pZXMgcmVub3ZhdGVkIChgY29sb255X3Jlbm9fcGN0YCkuDQoNCiMjIyBJbnNpZ2h0cyBpbiB0aGUgKipgc3RyZXNzb3IuY3N2YCoqIGRhdGFzZXQ6DQpUaGUgKipgc3RyZXNzb3IuY3N2YCoqIGRhdGFzZXQgY2FwdHVyZXMga2V5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWN0b3JzIGFmZmVjdGluZyBiZWUgY29sb25pZXMgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLiBJdCBpbmNsdWRlcyB0aGUgdmFyaWFibGUgYHllYXJgLCByZXByZXNlbnRpbmcgdGhlIHllYXIgb2Ygb2JzZXJ2YXRpb24sIGFuZCB0aGUgdmFyaWFibGUgYG1vbnRoc2AsIHNwZWNpZnlpbmcgdGhlIHRpbWUgcGVyaW9kIHdpdGhpbiB0aGF0IHllYXIuIE9ic2VydmF0aW9ucyBhcmUgY2F0ZWdvcml6ZWQgYnkgYHN0YXRlYCwgcHJvdmlkaW5nIGluc2lnaHRzIGludG8gcmVnaW9uYWwgZGlmZmVyZW5jZXMgaW4gdGhlIGNoYWxsZW5nZXMgZmFjZWQgYnkgYmVlIHBvcHVsYXRpb25zLiBUaGUgZGF0YXNldCBhbHNvIGlkZW50aWZpZXMgc3BlY2lmaWMgYHN0cmVzc29yYCB0eXBlcywgc3VjaCBhcyBWYXJyb2EgbWl0ZXMgb3IgcGVzdGljaWRlcywgYW5kIHF1YW50aWZpZXMgdGhlaXIgaW1wYWN0IHRocm91Z2ggdGhlIGBzdHJlc3NfcGN0YCB2YXJpYWJsZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSBvZiBjb2xvbmllcyBhZmZlY3RlZC48YnI+DQoNClRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgYSBwcmV2aWV3IG9mIHRoZSAqKmBzdHJlc3Nvci5jc3ZgKiogZGF0YXNldDoNCmBgYHtyIGdsaW1wc2Utb2Ytc3RyZXNzb3ItZGF0YSwgZWNobyA9IEZBTFNFfQ0KIyBFeGFtcGxlIHJvd3MgZnJvbSBzdHJlc3Nvci5jc3YNCnN0cmVzc29yX2V4YW1wbGUgPC0gZGF0YS5mcmFtZSgNCiAgeWVhciA9IGMoMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSwgMjAxNSksDQogIG1vbnRocyA9IGMoIkphbnVhcnktTWFyY2giLCAiSmFudWFyeS1NYXJjaCIsICJKYW51YXJ5LU1hcmNoIiwgIkphbnVhcnktTWFyY2giLCAiSmFudWFyeS1NYXJjaCIsICJKYW51YXJ5LU1hcmNoIiksDQogIHN0YXRlID0gYygiQWxhYmFtYSIsICJBbGFiYW1hIiwgIkFsYWJhbWEiLCAiQWxhYmFtYSIsICJBbGFiYW1hIiwgIkFsYWJhbWEiKSwNCiAgc3RyZXNzb3IgPSBjKCJWYXJyb2EgbWl0ZXMiLCAiT3RoZXIgcGVzdHMvcGFyYXNpdGVzIiwgIkRpc2Vhc2VzIiwgIlBlc3RpY2lkZXMiLCAiT3RoZXIiLCAiVW5rbm93biIpLA0KICBzdHJlc3NfcGN0ID0gYygxMC4wLCA1LjQsIE5BLCAyLjIsIDkuMSwgOS40KQ0KKQ0KDQojIERpc3BsYXkgdGFibGUNCnN0cmVzc29yX2V4YW1wbGUgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiUHJldmlldyBvZiB0aGUgc3RyZXNzb3IgZGF0YXNldCAoYHN0cmVzc29yLmNzdmApIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JQ0KICByb3dfc3BlYygxLCBiYWNrZ3JvdW5kID0gIiNGRkZGQ0MiKQ0KYGBgDQoNCkluIHRoZSA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsiPmZpcnN0IHJvdzwvc3Bhbj4gb2YgdGhlIHRhYmxlLCB0aGUgZGF0YSBwZXJ0YWlucyB0byBBbGFiYW1hIGR1cmluZyBKYW51YXJ54oCTTWFyY2ggMjAxNS4gVGhlIHN0cmVzc29yIGlzICJWYXJyb2EgbWl0ZXMsIiB3aGljaCBpbXBhY3RlZCAxMC4wJSAoc3RyZXNzX3BjdCkgb2YgdGhlIGJlZSBjb2xvbmllcyBkdXJpbmcgdGhpcyB0aW1lLiBWYXJyb2EgbWl0ZXMgYXJlIGEgc2lnbmlmaWNhbnQgc3RyZXNzb3Iga25vd24gdG8gaGFybSBiZWUgaGVhbHRoIGFuZCBjb250cmlidXRlIHRvIGNvbG9ueSBsb3NzZXMuDQoNCg0KIyBPdXIgSHlwb3RoZXNpcw0KRHJvdWdodCBjb25kaXRpb25zIG5lZ2F0aXZlbHkgaW1wYWN0IHRoZSBhdmFpbGFiaWxpdHkgb2YgZm9yYWdlIHJlc291cmNlcywgc3VjaCBhcyBmbG93ZXJzLCBmb3IgYmVlcywgdGhlcmVieSByZWR1Y2luZyB0aGVpciBmb29kIHN1cHBseSBhbmQgaW5jcmVhc2luZyBzdHJlc3Mgb24gYmVlIHBvcHVsYXRpb25zLiBBcyBhIHJlc3VsdCwgd2UgZXhwZWN0IHRoYXQgYXJlYXMgZXhwZXJpZW5jaW5nIG1vcmUgc2V2ZXJlIGRyb3VnaHQgY29uZGl0aW9ucyAoYXMgaW5kaWNhdGVkIGJ5IGhpZ2hlciBEU0NJIHZhbHVlcykgd2lsbCBzaG93IGhpZ2hlciBwZXJjZW50YWdlcyBvZiBzdHJlc3NlZCBjb2xvbmllcyBvciBldmVuIGxvc3QgY29sb25pZXMuPGJyPg0KPGJyPg0KSG93ZXZlciwgdGhpcyBleHBlY3RlZCBjb3JyZWxhdGlvbiBpcyBhbHNvIGluZmx1ZW5jZWQgYnkgdGhlIHJlZ2lvbiBhbmQgc2Vhc29uLiBJbiBzb21lIHJlZ2lvbnMsIHRoZSBpbXBhY3Qgb2YgZHJvdWdodCBvbiBiZWUgY29sb25pZXMgd2lsbCBiZSBtb3JlIHNldmVyZSBkdWUgdG8gZmFjdG9ycyBsaWtlIGxvY2FsIGNsaW1hdGUsIHR5cGljYWwgZHJvdWdodCBmcmVxdWVuY3ksIGFuZCBmb3JhZ2UgYXZhaWxhYmlsaXR5Ljxicj4NCg0KIyMgSW1wb3J0YW50IHZhcmlhYmxlcw0KVG8gdGVzdCBvdXIgaHlwb3RoZXNpcywgd2UgcmVseSBvbiBzZXZlcmFsIGtleSB2YXJpYWJsZXMgZnJvbSB0aGUgZGF0YXNldHM6PGJyPg0KDQotIGBEMGAgLSBgRDRgIGFuZCBgVzBgIC0gYFc0YDogRnJvbSB0aGUgKipgZHJvdWdodC5jc3ZgKiogZGF0YXNldDxicj4NClRoZXNlIHZhcmlhYmxlcyByZXByZXNlbnQgZHJvdWdodCBzZXZlcml0eSAoYEQwYCB0byBgRDRgKSBhbmQgd2V0bmVzcyBsZXZlbHMgKGBXMGAgdG8gYFc0YCksIHdoaWNoIGFsbG93IHVzIHRvIGFzc2VzcyB0aGUgaW1wYWN0IG9mIGRyb3VnaHQgYW5kIG1vaXN0dXJlIGNvbmRpdGlvbnMgb24gYmVlIGhlYWx0aC4NCg0KLSBgY29sb255X2xvc3RgOiBGcm9tIHRoZSAqKmBjb2xvbnkuY3N2YCoqIGRhdGFzZXQ8YnI+DQpUaGlzIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNvbG9uaWVzIGxvc3QgZHVyaW5nIGEgZ2l2ZW4gcGVyaW9kLCB3aGljaCBpcyBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkcm91Z2h0IGNvbmRpdGlvbnMgYW5kIGNvbG9ueSBzdHJlc3MuDQoNCi0gYHN0cmVzc19wY3RgOiBGcm9tIHRoZSAqKmBzdHJlc3Nvci5jc3ZgKiogZGF0YXNldDxicj4NClRoaXMgdmFyaWFibGUgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgY29sb25pZXMgYWZmZWN0ZWQgYnkgdmFyaW91cyBzdHJlc3NvcnMsIHN1Y2ggYXMgZHJvdWdodCBvciBwZXN0cywgaGVscGluZyB1cyBtZWFzdXJlIHRoZSBzdHJlc3Mgb24gYmVlIHBvcHVsYXRpb25zLg0KDQotIGBzdGF0ZWAgYW5kIGBkYXRlYC9gbW9udGhzYC9geWVhcmA6IEZyb20gYm90aCB0aGUgKipgZHJvdWdodC5jc3ZgKiogYW5kICoqYHN0cmVzc29yLmNzdmAqKiBkYXRhc2V0czxicj4NClRoZXNlIHZhcmlhYmxlcyBwcm92aWRlIGltcG9ydGFudCByZWdpb25hbCBhbmQgdGVtcG9yYWwgY29udGV4dCwgZW5hYmxpbmcgdXMgdG8gZXhwbG9yZSBzZWFzb25hbCBhbmQgcmVnaW9uYWwgdmFyaWF0aW9ucyBpbiBkcm91Z2h0IGltcGFjdCBvbiBiZWUgY29sb25pZXMuDQoNCiMgUHJlcHJvY2Vzc2luZw0KSW4gdGhpcyBjaGFwdGVyLCB3ZSBmb2N1cyBvbiBwcmVwYXJpbmcgdGhlIGRhdGFzZXRzIGludHJvZHVjZWQgaW4gQ2hhcHRlciBbRGF0YSBPdmVydmlld10oIyBEYXRhIE92ZXJ2aWV3KSBmb3Igc3Vic2VxdWVudCBhbmFseXNpcy48YnI+DQpGaXJzdCwgdmFyaWFibGVzIGFyZSBzdGFuZGFyZGl6ZWQgdG8gZW5zdXJlIGNvbnNpc3RlbnQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBmb3JtYXRzLiBOZXh0LCB0aGUgZGF0YSBpcyBmaWx0ZXJlZCB0byBhbGlnbiB3aXRoIHRoZSBjb21tb24gdGltZSBwZXJpb2QuIEZvbGxvd2luZyB0aGlzLCByZWxldmFudCBkYXRhc2V0cyBhcmUgbWVyZ2VkIGFuZCBmaW5hbGx5LCBhbnkgbWlzc2luZyBkYXRhIGlzIGFkZHJlc3NlZC48YnI+DQoNCiMjIFN0YW5kYXJkaXppbmcgVmFyaWFibGUgTmFtZXMgYW5kIEZvcm1hdHMNClRoZSAgKipgZHJvdWdodC5jc3ZgKiogZGF0YXNldCBpbml0aWFsbHkgc3RvcmVkIGRhdGVzIGluIGEgc2luZ2xlIHZhcmlhYmxlLCBmb3JtYXR0ZWQgYXMgYGRfeWVhcnxtb250aHxkYXlgIHdoaWxlIHRoZSAgKipgZHJvdWdodF9maXBzLmNzdmAqKiBkYXRhc2V0IHN0b3JlcyB5ZWFyLCAgbW9udGggYW5kIGRheSBhcyBzZXBhcmF0ZSB2YXJpYWJsZXMuIFRoZXJlZm9yZSB0aGlzIGZvcm1hdCB3YXMgcmVzdHJ1Y3R1cmVkIGludG8gdGhyZWUgc2VwYXJhdGUgdmFyaWFibGVzOiBgeWVhcmAsIGBtb250aGAsIGFuZCBgZGF5YC4gPGJyPg0KPGJyPg0KSGVyZSBpcyBhIGdsaW1wc2Ugb2YgdGhlIHRyYW5zZm9ybWVkICoqYGRyb3VnaHQuY3N2YCoqIGRhdGFzZXQ6IDxicj4NCg0KYGBge3IgY2hhbmdlLWRyb3VnaHQtREFURSwgZWNobyA9IEZBTFNFfQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGRhdGEgaW50byB5ZWFyLCBtb250aCBhbmQgZGF5DQpkcm91Z2h0IDwtIGRyb3VnaHQgJT4lDQogIG11dGF0ZSgNCiAgICAjIFJlbW92ZSAnZF8nIGZyb20gREFURQ0KICAgIGNsZWFuZWRfZGF0ZSA9IGdzdWIoImRfIiwgIiIsIERBVEUpLA0KICAgIA0KICAgICMgR2V0IHRoZSB5ZWFyDQogICAgeWVhciA9IHN1YnN0cihjbGVhbmVkX2RhdGUsIDEsIDQpLA0KICAgIA0KICAgICMgR2V0IG1vbnRoIGJ5IG5hbWUNCiAgICBtb250aCA9IGNhc2Vfd2hlbigNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIwMSIgfiAiSmFudWFyeSIsDQogICAgICBzdWJzdHIoY2xlYW5lZF9kYXRlLCA1LCA2KSA9PSAiMDIiIH4gIkZlYnJ1YXJ5IiwNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIwMyIgfiAiTWFyY2giLA0KICAgICAgc3Vic3RyKGNsZWFuZWRfZGF0ZSwgNSwgNikgPT0gIjA0IiB+ICJBcHJpbCIsDQogICAgICBzdWJzdHIoY2xlYW5lZF9kYXRlLCA1LCA2KSA9PSAiMDUiIH4gIk1heSIsDQogICAgICBzdWJzdHIoY2xlYW5lZF9kYXRlLCA1LCA2KSA9PSAiMDYiIH4gIkp1bmUiLA0KICAgICAgc3Vic3RyKGNsZWFuZWRfZGF0ZSwgNSwgNikgPT0gIjA3IiB+ICJKdWx5IiwNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIwOCIgfiAiQXVndXN0IiwNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIwOSIgfiAiU2VwdGVtYmVyIiwNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIxMCIgfiAiT2N0b2JlciIsDQogICAgICBzdWJzdHIoY2xlYW5lZF9kYXRlLCA1LCA2KSA9PSAiMTEiIH4gIk5vdmVtYmVyIiwNCiAgICAgIHN1YnN0cihjbGVhbmVkX2RhdGUsIDUsIDYpID09ICIxMiIgfiAiRGVjZW1iZXIiLA0KICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICApLA0KICAgIA0KICAgICMgR2V0IGRheQ0KICAgIGRheSA9IHN1YnN0cihjbGVhbmVkX2RhdGUsIDcsIDgpDQogICkgJT4lDQogIHNlbGVjdCgtY2xlYW5lZF9kYXRlKSAjIERvbid0IHNob3cgY2xlYW5lZF9kYXRlDQpgYGANCg0KYGBge3IgZ2xpbXBzZS10cmFuc2Zvcm1lZC1kcm91Z2h0LCBlY2hvID0gRkFMU0V9DQoNCiMgR2xpbXBzZSB0aGUgZmlyc3Qgcm93IG9mIHRoZSBuZXcgZHJvdWdodCBkYXRhc2V0DQpkcm91Z2h0ICU+JQ0KICBoZWFkKDEpICU+JSAgIyBTZWxlY3QgdGhlIGZpcnN0IDUgcm93cw0KICBrYWJsZShjYXB0aW9uID0gIlByZXZpZXcgb2YgdGhlIHRyYW5zZm9ybWVkIGRyb3VnaHQgZGF0YXNldCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCkluIHRoZSBkcm91Z2h0X2ZpcHMgZGF0YXNldCwgbW9udGhzIGFyZSByZXByZXNlbnRlZCBudW1lcmljYWxseSwgYW5kIHN0YXRlIG5hbWVzIGFyZSBhYmJyZXZpYXRlZC4gVG8gZW5zdXJlIGNvbnNpc3RlbmN5LCB0aGUgZGF0YSBoYXMgYmVlbiB0cmFuc2Zvcm1lZCB0byB1c2UgZnVsbCBtb250aCBuYW1lcyBhbmQgc3RhdGUgbmFtZXMgd3JpdHRlbiBpbiBmdWxsLjxicj4NCkJlbG93IGlzIGEgcHJldmlldyBvZiB0aGUgdHJhbnNmb3JtZWQgZGF0YXNldDo8YnI+DQoNCmBgYHtyIGNoYW5nZS1kcm91Z2h0LWZpcHMtZGF0ZSwgZWNobyA9IEZBTFNFfQ0KZHJvdWdodF9maXBzIDwtIGRyb3VnaHRfZmlwcyAlPiUNCiAgbXV0YXRlKA0KICAgIA0KICAgICMgR2V0IHRoZSB5ZWFyDQogICAgeWVhciA9IHN1YnN0cihkYXRlLCAxLCA0KSwNCiAgICANCiAgICAjIEdldCBtb250aCBieSBuYW1lDQogICAgbW9udGggPSBjYXNlX3doZW4oDQogICAgICBzdWJzdHIoZGF0ZSwgNiwgNykgPT0gIjAxIiB+ICJKYW51YXJ5IiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDIiIH4gIkZlYnJ1YXJ5IiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDMiIH4gIk1hcmNoIiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDQiIH4gIkFwcmlsIiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDUiIH4gIk1heSIsDQogICAgICBzdWJzdHIoZGF0ZSwgNiwgNykgPT0gIjA2IiB+ICJKdW5lIiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDciIH4gIkp1bHkiLA0KICAgICAgc3Vic3RyKGRhdGUsIDYsIDcpID09ICIwOCIgfiAiQXVndXN0IiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMDkiIH4gIlNlcHRlbWJlciIsDQogICAgICBzdWJzdHIoZGF0ZSwgNiwgNykgPT0gIjEwIiB+ICJPY3RvYmVyIiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMTEiIH4gIk5vdmVtYmVyIiwNCiAgICAgIHN1YnN0cihkYXRlLCA2LCA3KSA9PSAiMTIiIH4gIkRlY2VtYmVyIiwNCiAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfDQogICAgKSwNCiAgICBzdGF0ZV9mdWxsID0gY2FzZV93aGVuKA0KICAgICAgU3RhdGUgPT0gIkFMIiB+ICJhbGFiYW1hIiwNCiAgICAgIFN0YXRlID09ICJBSyIgfiAiYWxhc2thIiwNCiAgICAgIFN0YXRlID09ICJBWiIgfiAiYXJpem9uYSIsDQogICAgICBTdGF0ZSA9PSAiQVIiIH4gImFya2Fuc2FzIiwNCiAgICAgIFN0YXRlID09ICJDQSIgfiAiY2FsaWZvcm5pYSIsDQogICAgICBTdGF0ZSA9PSAiQ08iIH4gImNvbG9yYWRvIiwNCiAgICAgIFN0YXRlID09ICJDVCIgfiAiY29ubmVjdGljdXQiLA0KICAgICAgU3RhdGUgPT0gIkRFIiB+ICJkZWxhd2FyZSIsDQogICAgICBTdGF0ZSA9PSAiRkwiIH4gImZsb3JpZGEiLA0KICAgICAgU3RhdGUgPT0gIkdBIiB+ICJnZW9yZ2lhIiwNCiAgICAgIFN0YXRlID09ICJISSIgfiAiaGF3YWlpIiwNCiAgICAgIFN0YXRlID09ICJJRCIgfiAiaWRhaG8iLA0KICAgICAgU3RhdGUgPT0gIklMIiB+ICJpbGxpbm9pcyIsDQogICAgICBTdGF0ZSA9PSAiSU4iIH4gImluZGlhbmEiLA0KICAgICAgU3RhdGUgPT0gIklBIiB+ICJpb3dhIiwNCiAgICAgIFN0YXRlID09ICJLUyIgfiAia2Fuc2FzIiwNCiAgICAgIFN0YXRlID09ICJLWSIgfiAia2VudHVja3kiLA0KICAgICAgU3RhdGUgPT0gIkxBIiB+ICJsb3Vpc2lhbmEiLA0KICAgICAgU3RhdGUgPT0gIk1FIiB+ICJtYWluZSIsDQogICAgICBTdGF0ZSA9PSAiTUQiIH4gIm1hcnlsYW5kIiwNCiAgICAgIFN0YXRlID09ICJNQSIgfiAibWFzc2FjaHVzZXR0cyIsDQogICAgICBTdGF0ZSA9PSAiTUkiIH4gIm1pY2hpZ2FuIiwNCiAgICAgIFN0YXRlID09ICJNTiIgfiAibWlubmVzb3RhIiwNCiAgICAgIFN0YXRlID09ICJNUyIgfiAibWlzc2lzc2lwcGkiLA0KICAgICAgU3RhdGUgPT0gIk1PIiB+ICJtaXNzb3VyaSIsDQogICAgICBTdGF0ZSA9PSAiTVQiIH4gIm1vbnRhbmEiLA0KICAgICAgU3RhdGUgPT0gIk5FIiB+ICJuZWJyYXNrYSIsDQogICAgICBTdGF0ZSA9PSAiTlYiIH4gIm5ldmFkYSIsDQogICAgICBTdGF0ZSA9PSAiTkgiIH4gIm5ldyBoYW1wc2hpcmUiLA0KICAgICAgU3RhdGUgPT0gIk5KIiB+ICJuZXcgamVyc2V5IiwNCiAgICAgIFN0YXRlID09ICJOTSIgfiAibmV3IG1leGljbyIsDQogICAgICBTdGF0ZSA9PSAiTlkiIH4gIm5ldyB5b3JrIiwNCiAgICAgIFN0YXRlID09ICJOQyIgfiAibm9ydGggY2Fyb2xpbmEiLA0KICAgICAgU3RhdGUgPT0gIk5EIiB+ICJub3J0aCBkYWtvdGEiLA0KICAgICAgU3RhdGUgPT0gIk9IIiB+ICJvaGlvIiwNCiAgICAgIFN0YXRlID09ICJPSyIgfiAib2tsYWhvbWEiLA0KICAgICAgU3RhdGUgPT0gIk9SIiB+ICJvcmVnb24iLA0KICAgICAgU3RhdGUgPT0gIlBBIiB+ICJwZW5uc3lsdmFuaWEiLA0KICAgICAgU3RhdGUgPT0gIlJJIiB+ICJyaG9kZSBpc2xhbmQiLA0KICAgICAgU3RhdGUgPT0gIlNDIiB+ICJzb3V0aCBjYXJvbGluYSIsDQogICAgICBTdGF0ZSA9PSAiU0QiIH4gInNvdXRoIGRha290YSIsDQogICAgICBTdGF0ZSA9PSAiVE4iIH4gInRlbm5lc3NlZSIsDQogICAgICBTdGF0ZSA9PSAiVFgiIH4gInRleGFzIiwNCiAgICAgIFN0YXRlID09ICJVVCIgfiAidXRhaCIsDQogICAgICBTdGF0ZSA9PSAiVlQiIH4gInZlcm1vbnQiLA0KICAgICAgU3RhdGUgPT0gIlZBIiB+ICJ2aXJnaW5pYSIsDQogICAgICBTdGF0ZSA9PSAiV0EiIH4gIndhc2hpbmd0b24iLA0KICAgICAgU3RhdGUgPT0gIldWIiB+ICJ3ZXN0IHZpcmdpbmlhIiwNCiAgICAgIFN0YXRlID09ICJXSSIgfiAid2lzY29uc2luIiwNCiAgICAgIFN0YXRlID09ICJXWSIgfiAid3lvbWluZyIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgIyBHZXQgZGF5DQogICAgZGF5ID0gc3Vic3RyKGRhdGUsIDksIDEwKQ0KICApICU+JQ0KICByZW5hbWUoc3RhdGUgPSBzdGF0ZV9mdWxsKSAlPiUNCiAgc2VsZWN0KHN0YXRlLCBGSVBTLCBEU0NJLCB5ZWFyLCBtb250aCwgZGF5KQ0KYGBgDQoNCmBgYHtyIGdsaW1wc2UtdHJhbnNmb3JtZWQtZHJvdWdodC1maXBzLCBlY2hvID0gRkFMU0V9DQoNCiMgR2xpbXBzZSB0aGUgZmlyc3Qgcm93IG9mIHRoZSBuZXcgZHJvdWdodCBkYXRhc2V0DQpkcm91Z2h0X2ZpcHMgJT4lDQogIGhlYWQoMSkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiUHJldmlldyBvZiB0aGUgdHJhbnNmb3JtZWQgZHJvdWdodCBkYXRhc2V0IikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KTm93LCBhbGwgc2hhcmVkIHZhcmlhYmxlcyBhY3Jvc3MgdGhlICoqYGRyb3VnaHQuY3N2YCoqLCAqKmBkcm91Z2h0X2ZpcHMuY3N2YCoqLCBhbmQgKipgY29sb255LmNzdmAqKiBkYXRhc2V0cyBoYXZlIGJlZW4gc3RhbmRhcmRpemVkIHRvIGZvbGxvdyBhIGNvbnNpc3RlbnQgbmFtaW5nIGNvbnZlbnRpb24gYW5kIGZvcm1hdC4gVGhpcyBzdGFuZGFyZGl6YXRpb24gZW5zdXJlcyBjb21wYXRpYmlsaXR5LCBhbGxvd2luZyB0aGUgZGF0YXNldHMgdG8gYmUgbWVyZ2VkIHNlYW1sZXNzbHkgZm9yIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMuIA0KDQojIyBDb25uZWN0aW5nIERhdGFzZXRzOiBUZW1wb3JhbCBPdmVybGFwICANClRvIGVuc3VyZSB0aGUgZGF0YXNldHMgYXJlIGNvbXBhdGlibGUgZm9yIGFuYWx5c2lzLCBpdCBpcyBpbXBvcnRhbnQgdG8gYWxpZ24gdGhlaXIgdGltZSBwZXJpb2RzLiBUaGUgKipgY29sb255LmNzdmAqKiBkYXRhc2V0IHNwYW5zIHRoZSB5ZWFycyAyMDE1IHRvIDIwMjEsIHdoaWxlIHRoZSAqKmBkcm91Z2h0LmNzdmAqKiBhbmQgKipgZHJvdWdodF9maXBzLmNzdmAqKiBkYXRhc2V0cyBjb3ZlciBhIGJyb2FkZXIgdGltZSByYW5nZS48YnI+DQpUaGlzIGZpbHRlcmluZyBzdGVwIGVuc3VyZXMgdGhhdCBhbGwgb2JzZXJ2YXRpb25zIGFsaWduIHRlbXBvcmFsbHksIHRoZXJlZm9yZSByZW1vdmluZyBhbGwgZGF0YSBvdXRzaWRlIHRoaXMgMjAxNSB0byAyMDIxIHJhbmdlLiA8YnI+DQoNCmBgYHtyIHJlbW92ZS1kcm91Z2h0LWRhdGEtYmFzZWQtb24tZGF0ZSwgZWNobyA9IEZBTFNFfQ0KDQojIGdldCBjb3B5IG9mIG9yaWdpbmFsIGRyb3VnaHQgZGF0YSBmb3IgYmVmb3JlIGFuZCBhZnRlcg0KZHJvdWdodF9vcmlnaW5hbCA8LWRyb3VnaHQNCg0KZHJvdWdodCA8LSBkcm91Z2h0ICU+JQ0KICAgZmlsdGVyKHllYXIgPj0gMjAxNSAmICh5ZWFyIDwgMjAyMSB8ICh5ZWFyID09IDIwMjEgJiBtb250aCA8PSAiSnVuZSIpKSkNCmBgYA0KDQpgYGB7ciByZW1vdmUtZHJvdWdodC1maXBzLWRhdGEtYmFzZWQtb24tZGF0ZSwgZWNobyA9IEZBTFNFfQ0KDQojIGdldCBjb3B5IG9mIG9yaWdpbmFsIGRyb3VnaHQgZGF0YSBmb3IgYmVmb3JlIGFuZCBhZnRlcg0KZHJvdWdodF9maXBzX29yaWdpbmFsIDwtZHJvdWdodF9maXBzDQoNCmRyb3VnaHRfZmlwcyA8LSBkcm91Z2h0X2ZpcHMgJT4lDQogICBmaWx0ZXIoeWVhciA+PSAyMDE1ICYgKHllYXIgPCAyMDIxIHwgKHllYXIgPT0gMjAyMSAmIG1vbnRoIDw9ICJKdW5lIikpKQ0KYGBgDQoNCmBgYHtyIGNvbXBhcmUtYmVmb3JlLWFuZC1hZnRlci10ZW1wb3JhbC1maWx0ZXJpbmcsIGVjaG8gPSBGQUxTRX0NCg0KIyBTdW1tYXJpemUgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIGZpbHRlcmluZw0KZHJvdWdodF9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIFN0YWdlID0gYygiQmVmb3JlIEZpbHRlcmluZyIsICJBZnRlciBGaWx0ZXJpbmciKSwNCiAgUm93cyA9IGMoDQogICAgbnJvdyhkcm91Z2h0X29yaWdpbmFsKSwNCiAgICBucm93KGRyb3VnaHQpDQogICksDQogIERhdGVfUmFuZ2UgPSBjKA0KICAgIHBhc3RlKG1pbihkcm91Z2h0X29yaWdpbmFsJHllYXIpLCAiLSIsIG1heChkcm91Z2h0X29yaWdpbmFsJHllYXIpKSwgICMgVW5maWx0ZXJlZCByYW5nZQ0KICAgIHBhc3RlKG1pbihkcm91Z2h0JHllYXIpLCAiLSIsIG1heChkcm91Z2h0JHllYXIpKSAgIyBGaWx0ZXJlZCByYW5nZQ0KICApDQopDQoNCmRyb3VnaHRfZmlwc19zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIFN0YWdlID0gYygiQmVmb3JlIEZpbHRlcmluZyIsICJBZnRlciBGaWx0ZXJpbmciKSwNCiAgUm93cyA9IGMoDQogICAgbnJvdyhkcm91Z2h0X2ZpcHNfb3JpZ2luYWwpLA0KICAgIG5yb3coZHJvdWdodF9maXBzKQ0KICApLA0KICBEYXRlX1JhbmdlID0gYygNCiAgICBwYXN0ZShtaW4oZHJvdWdodF9maXBzX29yaWdpbmFsJHllYXIpLCAiLSIsIG1heChkcm91Z2h0X2ZpcHNfb3JpZ2luYWwkeWVhcikpLCAgIyBVbmZpbHRlcmVkIHJhbmdlDQogICAgcGFzdGUobWluKGRyb3VnaHRfZmlwcyR5ZWFyKSwgIi0iLCBtYXgoZHJvdWdodF9maXBzJHllYXIpKSAgIyBGaWx0ZXJlZCByYW5nZQ0KICApDQopDQoNCiMgRGlzcGxheSBjb21wYXJpc29uDQprYWJsZShkcm91Z2h0X3N1bW1hcnksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiB0aGUgZHJvdWdodCBEYXRhc2V0IEJlZm9yZSBhbmQgQWZ0ZXIgRmlsdGVyaW5nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQoNCmthYmxlKGRyb3VnaHRfZmlwc19zdW1tYXJ5LCBjYXB0aW9uID0gIlN1bW1hcnkgb2YgdGhlIGRyb3VnaHRfZmlwcyBEYXRhc2V0IEJlZm9yZSBhbmQgQWZ0ZXIgRmlsdGVyaW5nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQoNCmBgYA0KDQoNCiMjIENvbWJpbmluZyB0aGUgZGF0YQ0KTm93IHRoYXQgYWxsIHZhcmlhYmxlIG5hbWVzIGFyZSBzdGFuZGFyZGl6ZWQgYW5kIHRoZSB0aW1lIHNwYW5zIG9mIHRoZSBkYXRhc2V0cyBhcmUgYWxpZ25lZCwgdGhleSBjYW4gYmUgc2VhbWxlc3NseSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGRhdGFzZXQuIEhvd2V2ZXIsIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgbGV2ZWwgb2YgZGV0YWlsIGluIHRoZSB0aW1lIGRhdGEgYWNyb3NzIHRoZSBkYXRhc2V0cy4gVGhlICoqYGRyb3VnaHRfZmlwcy5jc3ZgKiogZGF0YXNldCBpbmNsdWRlcyBtdWx0aXBsZSBkYXRhIHBvaW50cyB3aXRoaW4gZWFjaCBtb250aCwgd2hlcmVhcyB0aGUgKipgZHJvdWdodC5jc3ZgKiogZGF0YXNldCByZWNvcmRzIGRhdGEgb25seSBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGguPGJyPg0KPGJyPg0KVXBvbiBmdXJ0aGVyIGludmVzdGlnYXRpb24sIGl0IHdhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGRyb3VnaHQgZGF0YXNldCBpcyBiYXNlZCBvbiB3ZWVrbHkgdXBkYXRlcywgYXMgZGV0YWlsZWQgb24gdGhlIFtVLlMuIERyb3VnaHQgTW9uaXRvciB3ZWJzaXRlXShodHRwczovL3d3dy5kcm91Z2h0Lmdvdi9kYXRhLW1hcHMtdG9vbHMvdXMtZHJvdWdodC1tb25pdG9yKS4gVGhlIGRhdGEgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGRheSBvZiBlYWNoIG1vbnRoIGFwcGVhcnMgdG8gcmVwcmVzZW50IGFuIGFnZ3JlZ2F0ZWQgdmFsdWUgZm9yIHRoZSBwcmVjZWRpbmcgbW9udGguPGJyPg0KPGJyPg0KVG8gZmFjaWxpdGF0ZSBtZXJnaW5nIHRoZSBkcm91Z2h0IGRhdGFzZXRzLCB0aGUgZW50cmllcyBpbiB0aGUgKipgZHJvdWdodF9maXBzLmNzdmAqKiBkYXRhc2V0IGFyZSBhdmVyYWdlZCBmb3IgZWFjaCBtb250aCBhbmQgeWVhci4gVGhlIHJlc3VsdGluZyBkYXRhc2V0IHNldHMgdGhlIGBkYXlgIHZhcmlhYmxlIHRvICIwMSIgZm9yIGVhY2ggZW50cnksIGFsaWduaW5nIHdpdGggdGhlIHRlbXBvcmFsIHN0cnVjdHVyZSBvZiB0aGUgZHJvdWdodCBkYXRhLiA8YnI+DQo8YnI+DQpgYGB7ciBhdmVyYWdlLWRyb3VnaHQtZmlwcy1kYXRhc2V0cywgZWNobyA9IEZBTFNFfQ0KZHJvdWdodF9maXBzX2F2ZyA8LSBkcm91Z2h0X2ZpcHMlPiUNCiAgICBncm91cF9ieShGSVBTLCBzdGF0ZSwgeWVhciwgbW9udGgpJT4lDQogIHN1bW1hcmlzZShhdmdfRFNDSSA9IG1lYW4oRFNDSSwgbmEucm0gPSBUUlVFKSklPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoDQogICAgZGF5ID0gcGFzdGUwKCIwMSIpDQogICAgKSU+JSANCiAgc2VsZWN0KHN0YXRlLCBGSVBTLCBhdmdfRFNDSSwgeWVhciwgbW9udGgsIGRheSkNCmRyb3VnaHRfZmlwc19hdmckc3RhdGUgPC0gZ3N1YigiICIsICItIiwgZHJvdWdodF9maXBzX2F2ZyRzdGF0ZSkNCmBgYA0KDQpIZXJlIGlzIGEgc2lkZS1ieS1zaWRlIGNvbXBhcmlzb24gdG8gaWxsdXN0cmF0ZSB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBkYXRhc2V0Ojxicj4NCmBgYHtyIGNvbXBhcmUtYmVmb3JlLWFuZC1hZnRlci1tb250aC1hdmVyYWdlLCBlY2hvID0gRkFMU0V9DQoNCmRyb3VnaHRfZmlwcyAlPiUNCiAgaGVhZCg1KSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJQcmV2aWV3IG9mIHRoZSBkcm91Z2h0IGZpcHMgZGF0YXNldCBiZWZvcmUgYXZlcmFnaW5nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQoNCmRyb3VnaHRfZmlwc19hdmcgJT4lDQogIGhlYWQoNSkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiUHJldmlldyBvZiB0aGUgZHJvdWdodCBmaXBzIGRhdGFzZXQgYWZ0ZXIgYXZlcmFnaW5nIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KVGhlIGRyb3VnaHQtcmVsYXRlZCBkYXRhc2V0cyBhcmUgbm93IGNvbWJpbmVkIGludG8gYSBzaW5nbGUsIHVuaWZpZWQgZGF0YXNldDo8YnI+DQpgYGB7ciBjb21iaW5lLWRyb3VnaHQtZGF0YXNldHMsIGVjaG8gPSBGQUxTRX0NCg0KY29tYmluZWRfZHJvdWdodCA8LSBkcm91Z2h0ICU+JQ0KICBsZWZ0X2pvaW4oZHJvdWdodF9maXBzX2F2ZywgYnkgPSBjKCJzdGF0ZSIsICJtb250aCIsICJ5ZWFyIiwgImRheSIpKQ0KYGBgDQoNCkEgcHJldmlldyBvZiB0aGUgY29tYmluZWQgZGF0YXNldCBpcyBzaG93biBiZWxvdzo8YnI+DQpgYGB7ciBwcmV2aWV3LW9mLWNvbWJpbmVkLWRyb3VnaHQtZGF0YXNldHMsIGVjaG8gPSBGQUxTRX0NCg0KY29tYmluZWRfZHJvdWdodCAlPiUNCiAgaGVhZCg1KSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJQcmV2aWV3IG9mIHRoZSBjb21iaW5lZCBkcm91Z2h0IGRhdGFzZXQiKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpUbyBhbGlnbiB0aGUgY29tYmluZWQgZGF0YXNldCB3aXRoIHRoZSAqKmBjb2xvbnkuY3N2YCoqIGRhdGFzZXQsIGl0IGlzIG5lY2Vzc2FyeSB0byBhZ2dyZWdhdGUgdGhlIGRhdGEgYnkgcXVhcnRlcnMsIGFzIHRoZSAqKmBjb2xvbnkuY3N2YCoqIGRhdGFzZXQgY29udGFpbnMgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHBlcmlvZHM6IEphbnVhcnktTWFyY2gsIEFwcmlsLUp1bmUsIEp1bHktU2VwdGVtYmVyLCBhbmQgT2N0b2Jlci1EZWNlbWJlci4gQ29uc2VxdWVudGx5LCB0aGUgdmFyaWFibGVzIGBEMGAtYEQ0YCwgYC05YCwgYFcwYC1gVzRgLCBhbmQgdGhlIHByZXZpb3VzbHkgYXZlcmFnZWQgYGF2Z19EU0NJYCBtdXN0IGJlIGF2ZXJhZ2VkIGFjcm9zcyB0aGUgcmVzcGVjdGl2ZSBwZXJpb2RzLiA8YnI+DQoNCmBgYHtyIGF2ZXJhZ2UtY29tYmluZWQtZHJvdWdodC1kYXRhc2V0LCBlY2hvID0gRkFMU0V9DQpjb21iaW5lZF9kcm91Z2h0X2F2ZyA8LSBjb21iaW5lZF9kcm91Z2h0ICU+JQ0KICBtdXRhdGUoDQogICAgbW9udGhzID0gY2FzZV93aGVuKA0KICAgICAgbW9udGggJWluJSBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIikgfiAiSmFudWFyeS1NYXJjaCIsDQogICAgICBtb250aCAlaW4lIGMoIkFwcmlsIiwgIk1heSIsICJKdW5lIikgfiAiQXByaWwtSnVuZSIsDQogICAgICBtb250aCAlaW4lIGMoIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIpIH4gIkp1bHktU2VwdGVtYmVyIiwNCiAgICAgIG1vbnRoICVpbiUgYygiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciIpIH4gIk9jdG9iZXItRGVjZW1iZXIiLA0KICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICApDQogICkgJT4lDQogIGdyb3VwX2J5KHN0YXRlLCB5ZWFyLCBtb250aHMpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX0QwID0gbWVhbihEMCwgbmEucm0gPSBUUlVFKSwNCiAgICBhdmdfRDEgPSBtZWFuKEQxLCBuYS5ybSA9IFRSVUUpLA0KICAgIGF2Z19EMiA9IG1lYW4oRDIsIG5hLnJtID0gVFJVRSksDQogICAgYXZnX0QzID0gbWVhbihEMywgbmEucm0gPSBUUlVFKSwNCiAgICBhdmdfbWludXM5ID0gbWVhbihgLTlgLCBuYS5ybSA9IFRSVUUpLA0KICAgIGF2Z19XMCA9IG1lYW4oVzAsIG5hLnJtID0gVFJVRSksDQogICAgYXZnX1cxID0gbWVhbihXMSwgbmEucm0gPSBUUlVFKSwNCiAgICBhdmdfVzIgPSBtZWFuKFcyLCBuYS5ybSA9IFRSVUUpLA0KICAgIGF2Z19XMyA9IG1lYW4oVzMsIG5hLnJtID0gVFJVRSksDQogICAgYXZnX1c0ID0gbWVhbihXNCwgbmEucm0gPSBUUlVFKSwNCiAgICBhdmdfRFNDSSA9IG1lYW4oYXZnX0RTQ0ksIG5hLnJtID0gVFJVRSkNCiAgKSAlPiUNCiAgdW5ncm91cCgpDQpgYGANCg0KDQpUaGUgZm9sbG93aW5nIHByb3ZpZGVzIGEgcHJldmlldzo8YnI+DQpgYGB7ciBwcmV2aWV3LW9mLWNvbWJpbmVkLWRyb3VnaHQtYXZnLWRhdGFzZXQsIGVjaG8gPSBGQUxTRX0NCmNvbWJpbmVkX2Ryb3VnaHRfYXZnICU+JQ0KICBoZWFkKDUpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlByZXZpZXcgb2YgdGhlIGF2ZXJhZ2VkIGNvbWJpbmVkIGRyb3VnaHQgZGF0YXNldCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCkZpbmFsbHksIGFsbCByZWxldmFudCBkYXRhc2V0cyBhcmUgY29uc29saWRhdGVkIGludG8gYSBzaW5nbGUgdW5pZmllZCBkYXRhc2V0Ljxicj4NCmBgYHtyIGNvbWJpbmUtZHJvdWdodC1hbmQtY29sb255LWRhdGEsIGVjaG8gPSBGQUxTRX0NCmxpYnJhcnkoc3RyaW5ncikNCg0KY29tYmluZWRfZHJvdWdodF9hdmcgPC0gY29tYmluZWRfZHJvdWdodF9hdmcgJT4lDQogIG11dGF0ZSgNCiAgICB5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSwNCiAgICBzdGF0ZSA9IHN0cl90b190aXRsZShzdGF0ZSkNCiAgKQ0KDQpjb2xvbnkgPC0gY29sb255ICU+JQ0KICBtdXRhdGUoDQogICAgeWVhciA9IGFzLm51bWVyaWMoeWVhciksDQogICAgc3RhdGUgPSBzdHJfdG9fdGl0bGUoc3RhdGUpDQogICkNCg0KY29tYmluZWRfZGF0YSA8LSBjb21iaW5lZF9kcm91Z2h0X2F2ZyAlPiUNCiAgbGVmdF9qb2luKGNvbG9ueSwgYnkgPSBjKCJzdGF0ZSIsICJ5ZWFyIiwgIm1vbnRocyIpKQ0KYGBgDQoNCkJlbG93IGlzIGEgcHJldmlldyBvZiBpdHMgY3VycmVudCBzdHJ1Y3R1cmU6PGJyPg0KYGBge3IgcHJldmlldy1vZi1jb21iaW5lZC1kYXRhc2V0LCBlY2hvID0gRkFMU0V9DQpjb21iaW5lZF9kYXRhICU+JQ0KICBoZWFkKDUpDQpgYGANCg0KIyMgTWlzc2luZyBkYXRhDQoNCkJlZm9yZSBkZWx2aW5nIGludG8gdGhlIGFuYWx5c2lzLCBpdCBpcyBjcnVjaWFsIHRvIGV2YWx1YXRlIGRhdGEgY29tcGxldGVuZXNzLiBNaXNzaW5nIHZhbHVlcyBjYW4gYWZmZWN0IGJvdGggYWNjdXJhY3kgYW5kIHJlbGlhYmlsaXR5LCBtYWtpbmcgaXQgaW1wb3J0YW50IHRvIGZpcnN0IGRldGVybWluZSBob3cgbWFueSByb3dzIGNvbnRhaW4gJ05BJyB2YWx1ZXMgYWNyb3NzIHRoZSBkYXRhc2V0cy48YnI+DQoNCmBgYHtyIGZpbmQtbWlzc2luZy1kYXRhLCBlY2hvID0gRkFMU0V9DQpuYV9jb3VudCA8LSBzdW0oIWNvbXBsZXRlLmNhc2VzKGNvbWJpbmVkX2RhdGEpKQ0KbmFfY291bnQNCmBgYA0KQSB0b3RhbCBvZiA2MTMgbWlzc2luZyB2YWx1ZXMgYXJlIHByZXNlbnQsIGRpc3RyaWJ1dGVkIGFzIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4NCg0KYGBge3IgbWlzc2luZy1kYXRhLXN1bW1hcnksIGVjaG8gPSBGQUxTRX0NCg0KIyBDYWxjdWxhdGUgdGhlIGNvdW50IG9mIG1pc3NpbmcgdmFsdWVzIGZvciBlYWNoIHZhcmlhYmxlDQptaXNzaW5nX2RhdGFfc3VtbWFyeSA8LSBjb21iaW5lZF9kYXRhICU+JQ0KICBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfiBzdW0oaXMubmEoLikpLCAubmFtZXMgPSAibWlzc2luZ197Y29sfSIpKQ0KDQojIENvbnZlcnQgdG8gYSBtb3JlIHJlYWRhYmxlIGZvcm1hdA0KbWlzc2luZ19kYXRhX3N1bW1hcnkgPC0gcGl2b3RfbG9uZ2VyKA0KICBtaXNzaW5nX2RhdGFfc3VtbWFyeSwNCiAgY29scyA9IGV2ZXJ5dGhpbmcoKSwNCiAgbmFtZXNfdG8gPSAiVmFyaWFibGUiLA0KICB2YWx1ZXNfdG8gPSAiTWlzc2luZ19Db3VudCINCikgJT4lDQogIG11dGF0ZShWYXJpYWJsZSA9IGdzdWIoIm1pc3NpbmdfIiwgIiIsIFZhcmlhYmxlKSkgIyBDbGVhbiB2YXJpYWJsZSBuYW1lcyBmb3IgcmVhZGFiaWxpdHkNCg0KIyBQcmludCB0aGUgc3VtbWFyeQ0KbWlzc2luZ19kYXRhX3N1bW1hcnkNCmBgYA0KDQpUaGUgZm9sbG93aW5nIGRpc3BsYXlzIGEgbGluZSB3aXRoIG1pc3NpbmcgZGF0YSBpbiBpdC4gaW4gdGhpcyBleGFtcGxlIHRoZSB2YXJpYWJsZSBgY29sb255X3Jlbm9fcGN0YCBpcyBtaXNzaW5nLjxicj4NCmBgYHtyIGRpc3BsYXktbWlzc2luZy1kYXRhLCBlY2hvID0gRkFMU0V9DQoNCiMgRGlzcGxheSBhIHJvdyB3aXRoIG1pc3NpbmcgZGF0YQ0Kcm93X3dpdGhfbmEgPC0gY29tYmluZWRfZGF0YVshY29tcGxldGUuY2FzZXMoY29tYmluZWRfZGF0YSksIF0gJT4lDQogIGhlYWQoMSkNCnJvd193aXRoX25hDQpgYGANCkFmdGVyIGlkZW50aWZ5aW5nIHRoZSBtaXNzaW5nIHZhbHVlcywgdGhlIG5leHQgc3RlcCBpcyB0byByZW1vdmUgdGhlIHJvd3MgY29udGFpbmluZyBhbnkgbWlzc2luZyBkYXRhLiBUbyBlbnN1cmUgdGhhdCBubyBtaXNzaW5nIHZhbHVlcyByZW1haW4gaW4gdGhlIGRhdGFzZXQsIHRoZSB0b3RhbCBjb3VudCBvZiBtaXNzaW5nIHZhbHVlcyBpcyByZWNhbGN1bGF0ZWQsIHdoaWNoIHNob3VsZCB5aWVsZCB6ZXJvLjxicj4NCg0KYGBge3IgcmVtb3ZlLW1pc3NpbmctZGF0YSwgZWNobyA9IEZBTFNFfQ0KDQojIFJlbW92ZSByb3dzIHdpdGggbWlzc2luZyBkYXRhDQpjb21iaW5lZF9kYXRhX2NsZWFuIDwtIGNvbWJpbmVkX2RhdGEgJT4lDQogIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkNCmBgYA0KDQpgYGB7ciB2ZXJpZnktbm8tbWlzc2luZy1kYXRhLCBlY2hvID0gRkFMU0V9DQojIFZlcmlmeSB0aGUgbmV3IGRhdGFzZXQgaGFzIG5vIG1pc3NpbmcgZGF0YQ0KbmFfY291bnRfY2xlYW4gPC0gc3VtKCFjb21wbGV0ZS5jYXNlcyhjb21iaW5lZF9kYXRhX2NsZWFuKSkNCm5hX2NvdW50X2NsZWFuDQpgYGANCg0KIyBFeHBsb3JpbmcgdGhlIGRhdGFzZXRzDQoNCkZpcnN0LCB0aGUgZGF0YSBvbiBiZWUgY29sb255IG1vcnRhbGl0eSBpcyBleGFtaW5lZC4gVGhlIGZvbGxvd2luZyB2aXN1YWxpemF0aW9uIGlsbHVzdHJhdGVzIGNvbG9ueSBsb3NzIHBlcmNlbnRhZ2VzIGFjcm9zcyBVLlMuIHN0YXRlcyBvdmVyIG11bHRpcGxlIHllYXJzLCBjYXB0dXJpbmcgYm90aCB0ZW1wb3JhbCBhbmQgc3BhdGlhbCB0cmVuZHMuIEEgY29sb3IgZ3JhZGllbnQgaXMgdXNlZCwgd2l0aCBibHVlIHJlcHJlc2VudGluZyBsb3cgbG9zcyByYXRlcyBhbmQgeWVsbG93IGluZGljYXRpbmcgaGlnaCBsb3NzIHJhdGVzLiBNb3N0IHN0YXRlcyBzaG93IGNvbG9ueSBsb3NzIHBlcmNlbnRhZ2VzIGJldHdlZW4gMTAlIGFuZCAyMCUsIGluZGljYXRpbmcgcmVsYXRpdmVseSBzdGFibGUgbG9zc2VzIHJhdGhlciB0aGFuIGRyYXN0aWMgY2hhbmdlcy4gT25seSBpbiBhIGZldyBzdGF0ZXMgZG8gdGhlIHZhbHVlcyByaXNlIHNpZ25pZmljYW50bHksIHJlYWNoaW5nIGhpZ2hlciBwZXJjZW50YWdlcy4gVGhlc2UgZXhjZXB0aW9ucyBtaWdodCBpbmRpY2F0ZSByZWdpb25zIHdoZXJlIGNvbG9ueSBsb3NzIGNvdWxkIGRyaXZlbiBieSBzcGVjaWZpYyBhZ3JpY3VsdHVyYWwgZmFjdG9ycy48YnI+DQoNCmBgYHtyIGFuaW1hdGUtdXMtbWFwLW9mLWxvc3QtY29sb25pZXMsIGVjaG8gPSBGQUxTRX0NCg0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQp9DQoNCmlmICghcmVxdWlyZSgibWFwcyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KfQ0KDQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoInRyYW5zZm9ybXIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0cmFuc2Zvcm1yIikgIyBGb3Igc21vb3RoIHRyYW5zaXRpb25zDQp9DQoNCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKQ0KfQ0KDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkodHJhbnNmb3JtcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobWFwcykNCg0KDQpzdGF0ZV9jb2xvbnlfZGF0YSA8LSBjb2xvbnkgJT4lDQogIGZpbHRlcih5ZWFyID49IDIwMTUgJiB5ZWFyIDw9IDIwMjEpICU+JQ0KICByZW5hbWUocmVnaW9uID0gc3RhdGUpICU+JQ0KICBtdXRhdGUoDQogICAgcmVnaW9uID0gdG9sb3dlcihyZWdpb24pLA0KICAgIHF1YXJ0ZXIgPSBjYXNlX3doZW4oDQogICAgICBtb250aHMgPT0gIkphbnVhcnktTWFyY2giIH4gIlExIiwNCiAgICAgIG1vbnRocyA9PSAiQXByaWwtSnVuZSIgfiAiUTIiLA0KICAgICAgbW9udGhzID09ICJKdWx5LVNlcHRlbWJlciIgfiAiUTMiLA0KICAgICAgbW9udGhzID09ICJPY3RvYmVyLURlY2VtYmVyIiB+ICJRNCINCiAgICApLA0KICAgIHBlcmlvZCA9IHBhc3RlKHllYXIsIHF1YXJ0ZXIsIG1vbnRocywgc2VwID0gIiAtICIpICMgQ29tYmluZSB5ZWFyLCBxdWFydGVyLCBhbmQgbW9udGhzDQogICkgJT4lDQogIHNlbGVjdCh5ZWFyLCByZWdpb24sIGNvbG9ueV9sb3N0X3BjdCwgcGVyaW9kKQ0KDQoNCiMgVVMgbWFwIGRhdGENCnVzX21hcCA8LSBtYXBfZGF0YSgic3RhdGUiKQ0KdXNfbWFwJHJlZ2lvbiA8LSBnc3ViKCItIiwgIiAiLCB1c19tYXAkcmVnaW9uKQ0KDQojIE1lcmdlIG1hcCBkYXRhIHdpdGggc3RhdGUgY29sb255IGRhdGENCm1hcF93aXRoX2RhdGEgPC0gdXNfbWFwICU+JQ0KICBsZWZ0X2pvaW4oc3RhdGVfY29sb255X2RhdGEsIGJ5ID0gInJlZ2lvbiIpDQoNCmdlbmVyYXRlX2dpZiA8LSBGQUxTRSAjIFNldCB0byBUUlVFIHRvIGdlbmVyYXRlIHRoZSBhbmltYXRpb24NCg0KDQppZiAoZ2VuZXJhdGVfZ2lmKSB7DQogICMgQW5pbWF0ZWQgbWFwDQogIGFuaW1hdGVkX21hcCA8LSBnZ3Bsb3QobWFwX3dpdGhfZGF0YSwgYWVzKGxvbmcsIGxhdCwgZ3JvdXAgPSBncm91cCkpICsNCiAgICBnZW9tX3BvbHlnb24oYWVzKGZpbGwgPSBjb2xvbnlfbG9zdF9wY3QpLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBjb29yZF9maXhlZCgxLjMpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKA0KICAgICAgdGl0bGUgPSAiTG9zdCBDb2xvbnkgQ291bnQgQWNyb3NzIFVTIFN0YXRlcyIsDQogICAgICBmaWxsID0gIkNvbG9uaWVzIExvc3QgQ291bnQiLA0KICAgICAgc3VidGl0bGUgPSAiUGVyaW9kOiB7Y2xvc2VzdF9zdGF0ZX0iDQogICAgKSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIkMiLCBuYS52YWx1ZSA9ICJncmV5OTAiKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksDQogICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKQ0KICAgICkgKw0KICAgIHRyYW5zaXRpb25fc3RhdGVzKA0KICAgICAgcGVyaW9kLA0KICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSAyLA0KICAgICAgc3RhdGVfbGVuZ3RoID0gMQ0KICAgICkgKyAjIEFuaW1hdGUgYWNyb3NzIHBlcmlvZHMgKHllYXIgYW5kIHF1YXJ0ZXIpDQogICAgZWFzZV9hZXMoJ2xpbmVhcicpICMgU21vb3RoIHRyYW5zaXRpb25zDQogIA0KICAjIFJlbmRlciBhbmQgc2F2ZSBhbmltYXRpb24NCiAgYW5pbWF0ZShhbmltYXRlZF9tYXAsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDAsIGZwcyA9IDEwLCBkdXJhdGlvbiA9IDE1LCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigibG9zdF9jb2xvbmllc19hbmltYXRpb24uZ2lmIikpDQp9IGVsc2Ugew0KICBrbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9zdF9jb2xvbmllc19hbmltYXRpb24uZ2lmIikNCn0NCg0KYGBgDQoNClRoZSBiZWxvdyBncmFwaCBwcm92aWRlcyBhZGRpdGlvbmFsIGluc2lnaHQgaW50byB0aGUgcGVyY2VudGFnZSBvZiBjb2xvbnkgbG9zcyBhY3Jvc3MgdmFyaW91cyBVLlMuIHN0YXRlcyBmcm9tIDIwMTUgdG8gMjAyMS4gSW4gdGhpcyBncmFwaCwgd2UgY2FuIGNsZWFybHkgc2VlIHRoYXQgbW9zdCBzdGF0ZXMgZXhwZXJpZW5jZSBjb2xvbnkgbG9zcyBwZXJjZW50YWdlcyBiZXR3ZWVuIDEwJSBhbmQgMjAlLCB3aXRoIG9ubHkgZmV3IHN0YWdlcyBzaG93aW5nIG9jY2FzaW9uYWwgc3Bpa2VzIGFib3ZlIHRoaXMgcmFuZ2UuPGJyPg0KDQpgYGB7ciBjb2xvbnktbG9zcy1wbG90LCBlY2hvPUZBTFNFfQ0KY29sb255X2F2Z19sb3NzX2J5X3N0YXRlIDwtIGNvbG9ueQ0KDQpjb2xvbnlfYXZnX2xvc3NfYnlfc3RhdGUkeWVhciA8LSBhcy5mYWN0b3IoY29sb255X2F2Z19sb3NzX2J5X3N0YXRlJHllYXIpDQoNCmNvbG9ueV9hdmdfbG9zc19ieV9zdGF0ZSA8LSBjb2xvbnkgJT4lDQogIGdyb3VwX2J5KHllYXIsIHN0YXRlKSAlPiUgICMgR3JvdXAgYnkgYm90aCB5ZWFyIGFuZCBzdGF0ZQ0KICBzdW1tYXJpemUoYXZnX2NvbG9ueV9sb3N0X3BjdCA9IG1lYW4oY29sb255X2xvc3RfcGN0LCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSANCg0KZ2dwbG90KGNvbG9ueV9hdmdfbG9zc19ieV9zdGF0ZSwgYWVzKHggPSBzdGF0ZSwgeSA9IGF2Z19jb2xvbnlfbG9zdF9wY3QsIGZpbGwgPSBhcy5mYWN0b3IoeWVhcikpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJDb2xvbnkgTG9zcyAoJSkgaW4gRWFjaCBVUyBTdGF0ZSAoMjAxNS0yMDIxKSIsDQogICAgICAgeCA9ICJTdGF0ZSIsDQogICAgICAgeSA9ICJDb2xvbmllcyBMb3N0ICglKSIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KPGJyPg0KVGhlIERyb3VnaHQgZGF0YSBjYW4gYmUgdmlzdWFsaXplZCBpbiBhIHNpbWlsYXIgbWFubmVyLCB1c2luZyB0aGUgRHJvdWdodCBTZXZlcml0eSBhbmQgQ292ZXJhZ2UgSW5kZXggKERTQ0kpIGFzIGEgbWVhc3VyZSBvZiBkcm91Z2h0IGludGVuc2l0eSBhbmQgZXh0ZW50LiBUaGUgRFNDSSByYW5nZXMgZnJvbSAwIChpbmRpY2F0aW5nIG5vIGRyb3VnaHQpIHRvIDUwMCAocmVwcmVzZW50aW5nIGV4dHJlbWUgZHJvdWdodCBjb25kaXRpb25zKS4gVGhlIHZpc3VhbGl6YXRpb24gY2xlYXJseSBoaWdobGlnaHRzIGEgcmVnaW9uYWwgcGF0dGVybiwgd2l0aCBzaWduaWZpY2FudGx5IG1vcmUgc2V2ZXJlIGRyb3VnaHQgY29uZGl0aW9ucyBpbiB0aGUgd2VzdGVybiBVbml0ZWQgU3RhdGVzIGNvbXBhcmVkIHRvIHRoZSBlYXN0ZXJuIHJlZ2lvbnMuPGJyPg0KDQpgYGB7ciBhbmltYXRlLXVzLW1hcC1vZi1hdmVyYWdlLURTQ0ksIGVjaG8gPSBGQUxTRX0NCg0Kc3RhdGVfZHJvdWdodF9kYXRhIDwtIGNvbWJpbmVkX2RhdGEgJT4lDQogIGZpbHRlcigNCiAgICB5ZWFyID49IDIwMTUgJiB5ZWFyIDw9IDIwMjEsDQogICAgISh5ZWFyID09IDIwMjEgJiBtb250aHMgJWluJSBjKCJKdWx5LVNlcHRlbWJlciIsICJPY3RvYmVyLURlY2VtYmVyIikpICMgRXhjbHVkZSAyMDIxIFEzIGFuZCBRNA0KICApICU+JQ0KICByZW5hbWUocmVnaW9uID0gc3RhdGUpICU+JQ0KICBtdXRhdGUoDQogICAgcmVnaW9uID0gdG9sb3dlcihyZWdpb24pLA0KICAgIHF1YXJ0ZXIgPSBjYXNlX3doZW4oDQogICAgICBtb250aHMgPT0gIkphbnVhcnktTWFyY2giIH4gIlExIiwNCiAgICAgIG1vbnRocyA9PSAiQXByaWwtSnVuZSIgfiAiUTIiLA0KICAgICAgbW9udGhzID09ICJKdWx5LVNlcHRlbWJlciIgfiAiUTMiLA0KICAgICAgbW9udGhzID09ICJPY3RvYmVyLURlY2VtYmVyIiB+ICJRNCINCiAgICApLA0KICAgIHBlcmlvZCA9IHBhc3RlKHllYXIsIHF1YXJ0ZXIsIG1vbnRocywgc2VwID0gIiAtICIpICMgQ29tYmluZSB5ZWFyLCBxdWFydGVyLCBhbmQgbW9udGhzDQogICkgJT4lDQogIHNlbGVjdCh5ZWFyLCByZWdpb24sIGF2Z19EU0NJLCBwZXJpb2QpDQoNCnN0YXRlX2Ryb3VnaHRfZGF0YSRyZWdpb24gPC0gZ3N1YigiLSIsICIgIiwgc3RhdGVfZHJvdWdodF9kYXRhJHJlZ2lvbikNCg0KIyBVUyBtYXAgZGF0YQ0KdXNfbWFwIDwtIG1hcF9kYXRhKCJzdGF0ZSIpDQp1c19tYXAkcmVnaW9uIDwtIGdzdWIoIi0iLCAiICIsIHVzX21hcCRyZWdpb24pDQoNCiMgTWVyZ2UgbWFwIGRhdGEgd2l0aCBzdGF0ZSBjb2xvbnkgZGF0YQ0KbWFwX3dpdGhfZGF0YSA8LSB1c19tYXAgJT4lDQogIGxlZnRfam9pbihzdGF0ZV9kcm91Z2h0X2RhdGEsIGJ5ID0gInJlZ2lvbiIpDQoNCmdlbmVyYXRlX2dpZiA8LSBGQUxTRSAjIFNldCB0byBUUlVFIHRvIGdlbmVyYXRlIHRoZSBhbmltYXRpb24NCg0KaWYgKGdlbmVyYXRlX2dpZikgew0KICAjIEFuaW1hdGVkIG1hcA0KICBhbmltYXRlZF9tYXAgPC0gZ2dwbG90KG1hcF93aXRoX2RhdGEsIGFlcyhsb25nLCBsYXQsIGdyb3VwID0gZ3JvdXApKSArDQogICAgZ2VvbV9wb2x5Z29uKGFlcyhmaWxsID0gYXZnX0RTQ0kpLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBjb29yZF9maXhlZCgxLjMpICsgDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKA0KICAgICAgdGl0bGUgPSAiQXZlcmFnZSBEU0NJIEFjcm9zcyBVUyBTdGF0ZXMiLA0KICAgICAgZmlsbCA9ICJBdmVyYWdlIERTQ0kiLA0KICAgICAgc3VidGl0bGUgPSAiUGVyaW9kOiB7Y2xvc2VzdF9zdGF0ZX0iICMgRHluYW1pY2FsbHkgdXBkYXRlIHN1YnRpdGxlIHdpdGggdGhlIHBlcmlvZA0KICAgICkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJDIiwgbmEudmFsdWUgPSAiZ3JleTkwIikgKw0KICAgIHRoZW1lKA0KICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLA0KICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkNCiAgICApICsNCiAgICB0cmFuc2l0aW9uX3N0YXRlcygNCiAgICAgIHBlcmlvZCwNCiAgICAgIHRyYW5zaXRpb25fbGVuZ3RoID0gMiwNCiAgICAgIHN0YXRlX2xlbmd0aCA9IDENCiAgICApICsgIyBBbmltYXRlIGFjcm9zcyBwZXJpb2RzDQogICAgZWFzZV9hZXMoJ2xpbmVhcicpICMgU21vb3RoIHRyYW5zaXRpb25zDQogIA0KICAjIFJlbmRlciBhbmQgc2F2ZSBhbmltYXRpb24NCiAgYW5pbWF0ZShhbmltYXRlZF9tYXAsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDAsIGZwcyA9IDEwLCBkdXJhdGlvbiA9IDE1LCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigiYXZnX0RTQ0lfYW5pbWF0aW9uLmdpZiIpKQ0KfWVsc2Ugew0KICBrbml0cjo6aW5jbHVkZV9ncmFwaGljcygiYXZnX0RTQ0lfYW5pbWF0aW9uLmdpZiIpDQp9DQpgYGANCkhlcmUsIHRoZSBEU0NJIGlzIGRlcGljdGVkIGFjcm9zcyBhbGwgeWVhcnMgZm9yIGFsbCBzdGF0ZXMuPGJyPg0KDQpgYGB7ciBhbm51YWwtYXZnLWRzY2ksIGVjaG89RkFMU0V9DQp5ZWFybHlfYXZnX0RTQ0kgPC0gY29tYmluZWRfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoc3RhdGUsIHllYXIpICU+JQ0KICBzdW1tYXJpemUoYXZnX0RTQ0lfeWVhcmx5ID0gbWVhbihhdmdfRFNDSSwgbmEucm0gPSBUUlVFKSkNCg0KZ2dwbG90KHllYXJseV9hdmdfRFNDSSwgYWVzKHggPSBzdGF0ZSwgeSA9IGF2Z19EU0NJX3llYXJseSwgZmlsbCA9IGFzLmZhY3Rvcih5ZWFyKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyAgIyBFbnN1cmUgYmFycyBhcmUgZ3JvdXBlZCBieSB5ZWFyDQogIGxhYnModGl0bGUgPSAiQW5udWFsIEF2ZXJhZ2UgRFNDSSBpbiBFYWNoIFVTIFN0YXRlICgyMDE1LTIwMjEpIiwNCiAgICAgICB4ID0gIlN0YXRlIiwNCiAgICAgICB5ID0gIkF2ZXJhZ2UgRFNDSSIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpjb21tYSkgKyAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpICANCmBgYA0KPGJyPg0KQmVsb3csIGludGVyYWN0aXZlIGJ1dHRvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gc3RhdGUtc3BlY2lmaWMgdmlzdWFsaXphdGlvbnMsIGFsbG93aW5nIGZvciBhIGRldGFpbGVkIGV4YW1pbmF0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb2xvbnkgbG9zcyBwZXJjZW50YWdlcyBhbmQgZHJvdWdodCBjb25kaXRpb25zLiBDbGlja2luZyBvbiBhIGJ1dHRvbiByZXZlYWxzIHR3byBwbG90cyBmb3IgdGhlIHNlbGVjdGVkIHN0YXRlLiBUaGUgZmlyc3QgcGxvdCBpbGx1c3RyYXRlcyB0aGUgdHJlbmQgb2YgY29sb255IGxvc3MgcGVyY2VudGFnZXMgYWxvbmdzaWRlIHRoZSBEcm91Z2h0IFNldmVyaXR5IGFuZCBDb3ZlcmFnZSBJbmRleCAoRFNDSSkgb3ZlciB0aW1lLCBvZmZlcmluZyBpbnNpZ2h0cyBpbnRvIG92ZXJhbGwgZHJvdWdodCBzZXZlcml0eS4gVGhlIHNlY29uZCBwbG90IHByZXNlbnRzIGNvbG9ueSBsb3NzIHBlcmNlbnRhZ2VzIGluIHJlbGF0aW9uIHRvIHRoZSBkcm91Z2h0IGxldmVscyBEMC1EMywgZW5hYmxpbmcgYSBtb3JlIGdyYW51bGFyIGNvbXBhcmlzb24gb2YgZGlmZmVyZW50IGRyb3VnaHQgaW50ZW5zaXRpZXMuPGJyPg0KRmVlbCBmcmVlIHRvIGV4cGxvcmUgdGhlIGRhdGEgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBzdGF0ZXMgdG8gdW5jb3ZlciBwb3RlbnRpYWwgcGF0dGVybnMgYW5kIHJlZ2lvbmFsIHZhcmlhdGlvbnMgaW4gYmVlIGNvbG9ueSBsb3NzZXMgYW5kIGRyb3VnaHQgY29uZGl0aW9ucy48YnI+DQoNCmBgYHtyIHByZXByb2Nlc3MtZHJvdWdodC1kYXRhLWZvci1wbG90dGluZywgZWNobz1GQUxTRX0NCg0KRDBfRDRfZHJvdWdodF9kYXRhIDwtIGNvbWJpbmVkX2RhdGEgJT4lDQogIGZpbHRlcigNCiAgICB5ZWFyID49IDIwMTUgJiB5ZWFyIDw9IDIwMjEsDQogICAgISh5ZWFyID09IDIwMjEgJiBtb250aHMgJWluJSBjKCJKdWx5LVNlcHRlbWJlciIsICJPY3RvYmVyLURlY2VtYmVyIikpICMgRXhjbHVkZSAyMDIxIFEzIGFuZCBRNA0KICApICU+JQ0KICByZW5hbWUocmVnaW9uID0gc3RhdGUpICU+JQ0KICBtdXRhdGUoDQogICAgcmVnaW9uID0gdG9sb3dlcihyZWdpb24pLA0KICAgIHF1YXJ0ZXIgPSBjYXNlX3doZW4oDQogICAgICBtb250aHMgPT0gIkphbnVhcnktTWFyY2giIH4gIlExIiwNCiAgICAgIG1vbnRocyA9PSAiQXByaWwtSnVuZSIgfiAiUTIiLA0KICAgICAgbW9udGhzID09ICJKdWx5LVNlcHRlbWJlciIgfiAiUTMiLA0KICAgICAgbW9udGhzID09ICJPY3RvYmVyLURlY2VtYmVyIiB+ICJRNCINCiAgICApLA0KICAgIHBlcmlvZCA9IHBhc3RlKHllYXIsIHF1YXJ0ZXIsIG1vbnRocywgc2VwID0gIiAtICIpICMgQ29tYmluZSB5ZWFyLCBxdWFydGVyLCBhbmQgbW9udGhzDQogICkgJT4lDQogIHNlbGVjdCh5ZWFyLCByZWdpb24sIGF2Z19EMCwgYXZnX0QxLCBhdmdfRDIsIGF2Z19EMywgcGVyaW9kKQ0KDQpEMF9ENF9kcm91Z2h0X2RhdGEkcmVnaW9uIDwtIGdzdWIoIi0iLCAiICIsIEQwX0Q0X2Ryb3VnaHRfZGF0YSRyZWdpb24pDQpgYGANCg0KDQpgYGB7ciBpbmNsdWRlLXN0YXRlLXBsb3RzLCBjaGlsZCA9ICJzdGF0ZV9wbG90cy5SbWQifQ0KICAjIG91dHNvdXJjZSB0aGUgcGxvdCBjb2RlIHRvIGRpZmZlcmVudCBmaWxlDQpgYGANCg0KDQojIEFuYWx5c2lzDQoNCkxvb2tpbmcgYXQgdGhlIGRhdGEsIHRoZXJlIGRvZXMgbm90IHNlZW4gdG8gYmUgYSBjbGVhciBjb3JyZWxhdGlvbiBiZXR3ZWVuIGRyb3VnaHQgc2V2ZXJpdHkgYW5kIGJlZSBjb2xvbnkgbG9zc2VzLiBJbiBjZXJ0YWluIGNhc2VzLCBzdWNoIGFzIGluIE1haW5lIGZyb20gMjAxNiB0byAyMDE4LCBhbiBpbmNyZWFzZSBpbiBkcm91Z2h0IHNldmVyaXR5IGFwcGVhcnMgdG8gY29ycmVzcG9uZCB3aXRoIGEgcmlzZSBpbiBjb2xvbnkgbG9zcyBwZXJjZW50YWdlLiBIb3dldmVyLCB0aGlzIHBhdHRlcm4gaXMgbm90IGNvbnNpc3RlbnRseSBvYnNlcnZlZCBhY3Jvc3MgYWxsIHN0YXRlcyBhbmQgdGltZSBwZXJpb2RzLCBzdWdnZXN0aW5nIHRoYXQgYWRkaXRpb25hbCBmYWN0b3JzIG1heSBpbmZsdWVuY2UgY29sb255IGxvc3NlcyBiZXlvbmQgZHJvdWdodCBjb25kaXRpb25zIGFsb25lLg0KDQpgYGB7ciBzaG93LW1haW5lLXBsb3QsIGVjaG8gPSBGQUxTRX0NCg0KICBnZ3Bsb3QobWFpbmVfZGF0YV8yLCBhZXMoeCA9IGFzLm51bWVyaWMocGVyaW9kKSkpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBjb2xvbnlfbG9zdF9wY3QsIGNvbG9yID0gIkNvbG9ueSBMb3N0ICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBjb2xvbnlfbG9zdF9wY3QsIGNvbG9yID0gIkNvbG9ueSBMb3N0ICglKSIpLCBzaXplID0gMikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGF2Z19EMCwgY29sb3IgPSAiRDAgKCUpIiksIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19EMCwgY29sb3IgPSAiRDAgKCUpIiksIHNpemUgPSAyKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYXZnX0QxLCBjb2xvciA9ICJEMSAoJSkiKSwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0gYXZnX0QxLCBjb2xvciA9ICJEMSAoJSkiKSwgc2l6ZSA9IDIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBhdmdfRDIsIGNvbG9yID0gIkQyICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBhdmdfRDIsIGNvbG9yID0gIkQyICglKSIpLCBzaXplID0gMikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGF2Z19EMywgY29sb3IgPSAiRDMgKCUpIiksIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19EMywgY29sb3IgPSAiRDMgKCUpIiksIHNpemUgPSAyKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiUGVyY2VudGFnZSIpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQ29sb255IExvc3QgKCUpIiA9ICJibHVlIiwgIkQwICglKSIgPSAiI0ZGQ0NDQyIsICJEMSAoJSkiID0gIiNGRjk5OTkiLCAiRDIgKCUpIiA9ICIjRkY2NjY2IiwgIkQzICglKSIgPSAiI0ZGMzMzMyIsICJENCAoJSkiID0gIiNDQzAwMDAiKSkgKw0KICAgIHNjYWxlX3hfY29udGludW91cygNCiAgICBicmVha3MgPSBzZXFfYWxvbmcodW5pcXVlKG1haW5lX2RhdGFfMiRwZXJpb2QpKSwgDQogICAgbGFiZWxzID0gdW5pcXVlKG1haW5lX2RhdGFfMiRwZXJpb2QpDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIkRyb3VnaHQgU2V2ZXJpdHkgYW5kIEJlZSBDb2xvbnkgTG9zcyBpbiBNYWluZSAoMjAxNS0yMDIxKSIsIHggPSAiUGVyaW9kIiwgZmlsbCA9ICJEcm91Z2h0IExldmVsIiwNCiAgICAgIGNvbG9yID0gIiIpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKyAgIA0KICAgIHRoZW1lKA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpDQogICAgKQ0KYGBgDQoNCkZvciBleGFtcGxlLCBpbiBNaXNzaXNzaXBwaSBmcm9tIDIwMTYgdG8gMjAxOCwgdGhlcmUgYXBwZWFycyB0byBiZSBubyBub3RpY2VhYmxlIGVmZmVjdCBvZiBkcm91Z2h0IG9uIGNvbG9ueSBsb3NzZXMuIERlc3BpdGUgYSBzaWduaWZpY2FudCBwZWFrIGluIGRyb3VnaHQgc2V2ZXJpdHkgZHVyaW5nIHRoaXMgcGVyaW9kLCBjb2xvbnkgbG9zcyBwZXJjZW50YWdlcyByZW1haW4gcmVsYXRpdmVseSBzdGFibGUuPGJyPiANCiANCg0KYGBge3Igc2hvdy1taXNzaXNzaXBwaS1wbG90LCBlY2hvPUZBTFNFfQ0KICBnZ3Bsb3QobWlzc2lzc2lwcGlfZGF0YV8yLCBhZXMoeCA9IGFzLm51bWVyaWMocGVyaW9kKSkpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBjb2xvbnlfbG9zdF9wY3QsIGNvbG9yID0gIkNvbG9ueSBMb3N0ICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBjb2xvbnlfbG9zdF9wY3QsIGNvbG9yID0gIkNvbG9ueSBMb3N0ICglKSIpLCBzaXplID0gMikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGF2Z19EMCwgY29sb3IgPSAiRDAgKCUpIiksIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19EMCwgY29sb3IgPSAiRDAgKCUpIiksIHNpemUgPSAyKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYXZnX0QxLCBjb2xvciA9ICJEMSAoJSkiKSwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0gYXZnX0QxLCBjb2xvciA9ICJEMSAoJSkiKSwgc2l6ZSA9IDIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBhdmdfRDIsIGNvbG9yID0gIkQyICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBhdmdfRDIsIGNvbG9yID0gIkQyICglKSIpLCBzaXplID0gMikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGF2Z19EMywgY29sb3IgPSAiRDMgKCUpIiksIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19EMywgY29sb3IgPSAiRDMgKCUpIiksIHNpemUgPSAyKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiUGVyY2VudGFnZSIpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQ29sb255IExvc3QgKCUpIiA9ICJibHVlIiwgIkQwICglKSIgPSAiI0ZGQ0NDQyIsICJEMSAoJSkiID0gIiNGRjk5OTkiLCAiRDIgKCUpIiA9ICIjRkY2NjY2IiwgIkQzICglKSIgPSAiI0ZGMzMzMyIsICJENCAoJSkiID0gIiNDQzAwMDAiKSkgKw0KICAgIHNjYWxlX3hfY29udGludW91cygNCiAgICBicmVha3MgPSBzZXFfYWxvbmcodW5pcXVlKG1pc3Npc3NpcHBpX2RhdGFfMiRwZXJpb2QpKSwgDQogICAgbGFiZWxzID0gdW5pcXVlKG1pc3Npc3NpcHBpX2RhdGFfMiRwZXJpb2QpDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICBsYWJzKHRpdGxlID0gIkRyb3VnaHQgU2V2ZXJpdHkgYW5kIEJlZSBDb2xvbnkgTG9zcyBpbiBNaXNzaXNzaXBwaSAoMjAxNS0yMDIxKSIsIHggPSAiUGVyaW9kIiwgZmlsbCA9ICJEcm91Z2h0IExldmVsIiwNCiAgICAgIGNvbG9yID0gIiIpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKyAgIA0KICAgIHRoZW1lKA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpDQogICAgKQ0KYGBgDQoNCg0KSW4gc29tZSBjYXNlcywgc3VjaCBhcyBpbiBJbGxpbm9pcywgY29sb255IGxvc3NlcyBldmVuIGV4aGliaXQgc2VlbWluZ2x5IHJhbmRvbSBmbHVjdHVhdGlvbnMgd2l0aCBubyBjbGVhciBjb25uZWN0aW9uIHRvIGRyb3VnaHQgbGV2ZWxzLjxicj4NCg0KYGBge3IgcHNob3ctaWxsaW5vaXMtcGxvdCwgZWNobz1GQUxTRX0NCiAgZ2dwbG90KGlsbGlub2lzX2RhdGFfMiwgYWVzKHggPSBhcy5udW1lcmljKHBlcmlvZCkpKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gY29sb255X2xvc3RfcGN0LCBjb2xvciA9ICJDb2xvbnkgTG9zdCAoJSkiKSwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0gY29sb255X2xvc3RfcGN0LCBjb2xvciA9ICJDb2xvbnkgTG9zdCAoJSkiKSwgc2l6ZSA9IDIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBhdmdfRDAsIGNvbG9yID0gIkQwICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBhdmdfRDAsIGNvbG9yID0gIkQwICglKSIpLCBzaXplID0gMikgKw0KICAgIGdlb21fbGluZShhZXMoeSA9IGF2Z19EMSwgY29sb3IgPSAiRDEgKCUpIiksIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChhZXMoeSA9IGF2Z19EMSwgY29sb3IgPSAiRDEgKCUpIiksIHNpemUgPSAyKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYXZnX0QyLCBjb2xvciA9ICJEMiAoJSkiKSwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3BvaW50KGFlcyh5ID0gYXZnX0QyLCBjb2xvciA9ICJEMiAoJSkiKSwgc2l6ZSA9IDIpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBhdmdfRDMsIGNvbG9yID0gIkQzICglKSIpLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKHkgPSBhdmdfRDMsIGNvbG9yID0gIkQzICglKSIpLCBzaXplID0gMikgKw0KICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlBlcmNlbnRhZ2UiKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkNvbG9ueSBMb3N0ICglKSIgPSAiYmx1ZSIsICJEMCAoJSkiID0gIiNGRkNDQ0MiLCAiRDEgKCUpIiA9ICIjRkY5OTk5IiwgIkQyICglKSIgPSAiI0ZGNjY2NiIsICJEMyAoJSkiID0gIiNGRjMzMzMiLCAiRDQgKCUpIiA9ICIjQ0MwMDAwIikpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgYnJlYWtzID0gc2VxX2Fsb25nKHVuaXF1ZShpbGxpbm9pc19kYXRhXzIkcGVyaW9kKSksIA0KICAgIGxhYmVscyA9IHVuaXF1ZShpbGxpbm9pc19kYXRhXzIkcGVyaW9kKQ0KICAgICkgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgbGFicyh0aXRsZSA9ICJEcm91Z2h0IFNldmVyaXR5IGFuZCBCZWUgQ29sb255IExvc3MgaW4gSWxsaW5vaXMgKDIwMTUtMjAyMSkiLCB4ID0gIlBlcmlvZCIsIGZpbGwgPSAiRHJvdWdodCBMZXZlbCIsDQogICAgICBjb2xvciA9ICIiKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsgICANCiAgICB0aGVtZSgNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKQ0KICAgICkNCmBgYA0KDQoNClRoaXMgaW5kaWNhdGVzIHRoYXQgY29sb255IGxvc3MgaXMgbGlrZWx5IGRyaXZlbiBieSBtdWx0aXBsZSBmYWN0b3JzIGJleW9uZCBqdXN0IGRyb3VnaHQgc2V2ZXJpdHkuPGJyPg0KDQpUaGlzIGlzIGZ1cnRoZXIgcmVmbGVjdGVkIGluIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYmV0d2VlbiB0aGUgcGVyY2VudGFnZSBvZiBjb2xvbmllcyBsb3N0IGFuZCBkcm91Z2h0IGxldmVscyAoRDAtRDMpLiBBIHNlbGVjdGlvbiBvZiB0aGVzZSBjb2VmZmljaWVudHMgZm9yIHZhcmlvdXMgc3RhdGVzIGlzIHByZXNlbnRlZCBpbiB0aGUgdGFibGUgYmVsb3cuPGJyPg0KDQpgYGB7ciBjYWxjdWxhdGUtY29ycmVsYXRpb24tY29lZmZpY2llbnRzLCBlY2hvID0gRkFMU0V9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCg0KIyBMaXN0IG9mIHN0YXRlcyB0byBpbmNsdWRlIGluIHRoZSB0YWJsZQ0Kc3RhdGVzIDwtIGMoImFsYWJhbWEiLCAiYXJpem9uYSIsICJhcmthbnNhcyIsICJjYWxpZm9ybmlhIiwgDQogICAgICAgICAgICAiY29sb3JhZG8iLCAiY29ubmVjdGljdXQiLCAiZmxvcmlkYSIsICJnZW9yZ2lhIiwgIm1haW5lIiwgIm1pc3Npc3NpcHBpIiwgImlsbGlub2lzIikNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgY29ycmVsYXRpb25zIGZvciBhIGdpdmVuIHN0YXRlDQpjYWxjdWxhdGVfY29ycmVsYXRpb25zIDwtIGZ1bmN0aW9uKHN0YXRlKSB7DQogIGRhdGEgPC0gZ2V0KHBhc3RlMChzdGF0ZSwgIl9kYXRhXzIiKSkgICMgUmV0cmlldmUgZGF0YXNldCBkeW5hbWljYWxseQ0KICANCiAgIyBEcm9wIHJvd3Mgd2l0aCBOQSBpbiB0aGUgcmVsZXZhbnQgY29sdW1ucw0KICBkYXRhX2NsZWFuIDwtIGRhdGEgJT4lDQogICAgZmlsdGVyKCFpcy5uYShjb2xvbnlfbG9zdF9wY3QpICYgIWlzLm5hKGF2Z19EMCkgJiAhaXMubmEoYXZnX0QxKSAmICFpcy5uYShhdmdfRDIpICYgIWlzLm5hKGF2Z19EMykpDQogIA0KICAjIENoZWNrIGlmIHRoZSBjbGVhbmVkIGRhdGEgc3RpbGwgaGFzIGVub3VnaCBkYXRhIHBvaW50cyB0byBjb21wdXRlIGNvcnJlbGF0aW9uDQogIGlmIChucm93KGRhdGFfY2xlYW4pID4gMSkgew0KICAgIHJldHVybihjKA0KICAgICAgU3RhdGUgPSB0b29sczo6dG9UaXRsZUNhc2Uoc3RhdGUpLA0KICAgICAgRDAgPSByb3VuZChjb3IoZGF0YV9jbGVhbiRjb2xvbnlfbG9zdF9wY3QsIGRhdGFfY2xlYW4kYXZnX0QwLCBtZXRob2QgPSAicGVhcnNvbiIpLCAzKSwNCiAgICAgIEQxID0gcm91bmQoY29yKGRhdGFfY2xlYW4kY29sb255X2xvc3RfcGN0LCBkYXRhX2NsZWFuJGF2Z19EMSwgbWV0aG9kID0gInBlYXJzb24iKSwgMyksDQogICAgICBEMiA9IHJvdW5kKGNvcihkYXRhX2NsZWFuJGNvbG9ueV9sb3N0X3BjdCwgZGF0YV9jbGVhbiRhdmdfRDIsIG1ldGhvZCA9ICJwZWFyc29uIiksIDMpLA0KICAgICAgRDMgPSByb3VuZChjb3IoZGF0YV9jbGVhbiRjb2xvbnlfbG9zdF9wY3QsIGRhdGFfY2xlYW4kYXZnX0QzLCBtZXRob2QgPSAicGVhcnNvbiIpLCAzKQ0KICAgICkpDQogIH0gZWxzZSB7DQogICAgcmV0dXJuKGMoU3RhdGUgPSB0b29sczo6dG9UaXRsZUNhc2Uoc3RhdGUpLCBEMCA9IE5BLCBEMSA9IE5BLCBEMiA9IE5BLCBEMyA9IE5BKSkNCiAgfQ0KfQ0KDQojIENyZWF0ZSB0aGUgY29ycmVsYXRpb24gdGFibGUNCmNvcnJlbGF0aW9uX3RhYmxlIDwtIHN0YXRlcyAlPiUNCiAgbWFwX2RmcihjYWxjdWxhdGVfY29ycmVsYXRpb25zKSAlPiUNCiAgYXNfdGliYmxlKCkNCg0KIyBQcmludCB0aGUgY29ycmVsYXRpb24gdGFibGUgd2l0aCByb3VuZGVkIHZhbHVlcw0KY29ycmVsYXRpb25fdGFibGUgJT4lDQogIGthYmxlKCJodG1sIiwgY2FwdGlvbiA9ICJQZWFyc29uIENvcnJlbGF0aW9uIEJldHdlZW4gQ29sb255IExvc3MgYW5kIERyb3VnaHQgTGV2ZWxzIChEMC1EMykiKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQ0KDQpgYGANCg0KVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IChyKSBpcyBhIHN0YXRpc3RpY2FsIG1lYXN1cmUgdGhhdCBxdWFudGlmaWVzIHRoZSBzdHJlbmd0aCBhbmQgZGlyZWN0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gdmFyaWFibGVzLiBBIHZhbHVlIG9mIHIgPSAxIGluZGljYXRlcyBhIHBlcmZlY3QgcG9zaXRpdmUgY29ycmVsYXRpb24sIG1lYW5pbmcgdGhhdCBhcyBvbmUgdmFyaWFibGUgaW5jcmVhc2VzLCB0aGUgb3RoZXIgYWxzbyBpbmNyZWFzZXMgaW4gYSBwZXJmZWN0bHkgbGluZWFyIG1hbm5lci4gQ29udmVyc2VseSwgciA9IC0xIHJlcHJlc2VudHMgYSBwZXJmZWN0IG5lZ2F0aXZlIGNvcnJlbGF0aW9uLCB3aGVyZSBhbiBpbmNyZWFzZSBpbiBvbmUgdmFyaWFibGUgY29ycmVzcG9uZHMgdG8gYSBkZWNyZWFzZSBpbiB0aGUgb3RoZXIuIEEgdmFsdWUgb2YgciA9IDAgc3VnZ2VzdHMgbm8gbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMuIEJhc2VkIG9uIHRoZSBjb3JyZWxhdGlvbiB2YWx1ZXMgcHJlc2VudGVkLCB0aGVyZSBhcHBlYXJzIHRvIGJlIGxpdHRsZSB0byBubyBjb25zaXN0ZW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRyb3VnaHQgc2V2ZXJpdHkgYW5kIGJlZSBjb2xvbnkgbW9ydGFsaXR5Ljxicj4gICAgDQoNCiMgQ29uY2x1c2lvbg0KDQpBcyBtZW50aW9uZWQgYWJvdmUsIG91ciBoeXBvdGhlc2lzIHN1Z2dlc3RlZCBhIGxpbmsgYmV0d2VlbiBkcm91Z2h0IHNldmVyaXR5IGFuZCBjb2xvbnkgbG9zc2VzIHdpdGggdGhlIGV4cGVjdGF0aW9uIHRoYXQgaGlnaGVyIERTQ0kgdmFsdWVzIHdvdWxkIGNvcnJlc3BvbmQgdG8gaW5jcmVhc2VkIGNvbG9ueSBsb3NzIHBlcmNlbnRhZ2VzLiBCdXQgYmFzZWQgb24gb3VyIGFuYWx5c2lzLCB3aGlsZSBkcm91Z2h0IGNvbmRpdGlvbnMgbWF5IGNvbnRyaWJ1dGUgdG8gY29sb255IHN0cmVzcyBpbiBjZXJ0YWluIGNhc2VzLCB0aGV5IGRvIG5vdCBjb25zaXN0ZW50bHkgZHJpdmUgY29sb255IGxvc3NlcyBvbiB0aGVpciBvd24uIFRoZSByZXN1bHRzIHN1Z2dlc3QgZHJvdWdodCBhbG9uZSBpcyBub3QgYSByZWxpYWJsZSBwcmVkaWN0b3Igb2YgY29sb255IGxvc3MuIEluc3RlYWQsIG11bHRpcGxlIGZhY3RvcnMgbGlrZWx5IGludGVyYWN0IHRvIGluZmx1ZW5jZSBiZWUgcG9wdWxhdGlvbiBkZWNsaW5lcywgdW5kZXJzY29yaW5nIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgaXNzdWUgYW5kIGhpZ2hsaWdodGluZyB0aGUgbmVlZCBmb3IgYSBtdWx0aWZhY3RvcmlhbCBhcHByb2FjaCBpbiBmdXR1cmUgcmVzZWFyY2ggYW5kIGNvbnNlcnZhdGlvbiBlZmZvcnRzLiA8YnI+DQoNCiMgUmVmZXJlbmNlcw0KDQo=